【发布时间】:2018-06-02 12:52:53
【问题描述】:
我在 IOCP 结构化服务器上使用 wsasend。 有一个问题。
wsabuf [bufcount - 1] .buf = pPacket-> GetPacketBufferPtr ();
wsabuf [bufcount - 1] .len = (int) pPacket-> Get_PacketSize ();
iSendSize + = wsabuf [bufcount - 1] .len;
bufcount ++;
int retval = WSASend (pSession-> socket, wsabuf, bufcount-1, & sendbytes,flag, & pSession-> overlapped_Send, NULL);
if (retval == SOCKET_ERROR)
{
if (WSAGetLastError ()! = WSA_IO_PENDING)
{
......
}
}
if (retval == 0)
{
if (sendbytes! = iSendSize)
{
........
}
}
.....
在上面的代码中,我保存了要发送到 wsabuf 的数据包,并通过 wsasend 发送它。 最后,我比较了 sendbytes 和 iSendSize 。 顺便说一句,sendbytes 和 iSendSize 是不同的。 我不知道为什么。
【问题讨论】:
-
From the documentation: "如果
lpOverlapped参数不是NULL,则将NULL用于此参数(lpNumberOfBytesSent) 以避免潜在的错误结果。" -
如果使用异步io,一定不能使用(ignore)
sendbytes,而是overlapped_Send.InternalHigh或者GetOverlappedResult返回的NumberOfBytesTransferred(其实就是简单的复制@987654330 @value to here) 操作完成时 -
@IgorTandetnik 文档有误。在带有 SP2 的 Windows XP 上,这将因访问冲突而崩溃,因为没有检查
lpNumberOfBytesSent是否为NULL。WSASend在 Windows XP 上的工作方式不同。它不会忽略lpNumberOfBytesSent,即使它被设置为NULL并且该函数被称为重叠。
标签: visual-c++ iocp overlapped-io