18,356
社区成员
发帖
与我相关
我的任务
分享
BOOL isOK = GetQueuedCompletionStatus(
hCompletionPort,
&dwTrans,
(LPDWORD) &lpClientContext,
&lpOverlapped, INFINITE);
获取发送结果。发现有 dwTrans > lpOverlapped->m_wsabuf.len并且lpOverlapped->m_wsabuf.len == 0的情况出现。dwTrans 一般与原来发送的数据长度(lpOverlapped->m_wsabuf.len)相等。问题是lpOverlapped->m_wsabuf.len == 0这是什么原因引起的?另外数据是发送成功还是没有成功呢?
while (TRUE)
{
// 完成端口有消息来了
if (GetQueuedCompletionStatus(CompletionPort, & BytesTransferred,(LPDWORD) & PerHandleData, (LPOVERLAPPED * ) & PerIoData, INFINITE) == 0 )
{
printf( " GetQueuedCompletionStatus failed with error %d\n " , GetLastError());
return 0 ;
}
// 是不是有人退出了
if (BytesTransferred == 0 )
{
printf( " Closing socket %d\n " , PerHandleData -> Socket);
if (closesocket(PerHandleData -> Socket) == SOCKET_ERROR)
{
printf( " closesocket() failed with error %d\n " , WSAGetLastError());
return 0 ;
}
GlobalFree(PerHandleData);
GlobalFree(PerIoData);
continue ;
}
//
if (PerIoData -> BytesRECV == 0 )
{
PerIoData -> BytesRECV = BytesTransferred;
PerIoData -> BytesSEND = 0 ;
}
else
{
PerIoData -> BytesSEND += BytesTransferred;
}
if (PerIoData -> BytesRECV > PerIoData -> BytesSEND)
{
// Post another WSASend() request.
// Since WSASend() is not gauranteed to send all of the bytes requested,
// continue posting WSASend() calls until all received bytes are sent.
ZeroMemory( & (PerIoData -> Overlapped), sizeof (OVERLAPPED));
PerIoData -> DataBuf.buf = PerIoData -> Buffer + PerIoData -> BytesSEND;
PerIoData -> DataBuf.len = PerIoData -> BytesRECV - PerIoData -> BytesSEND;
if (WSASend(PerHandleData -> Socket, & (PerIoData -> DataBuf), 1 , & SendBytes, 0 ,
& (PerIoData -> Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf( " WSASend() failed with error %d\n " , WSAGetLastError());
return 0 ;
}
}
}
else
{
PerIoData -> BytesRECV = 0 ;
// Now that there are no more bytes to send post another WSARecv() request.
Flags = 0 ;
ZeroMemory( & (PerIoData -> Overlapped), sizeof (OVERLAPPED));
PerIoData -> DataBuf.len = DATA_BUFSIZE;
PerIoData -> DataBuf.buf = PerIoData -> Buffer;
if (WSARecv(PerHandleData -> Socket, & (PerIoData -> DataBuf), 1 , & RecvBytes, & Flags, & (PerIoData -> Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf( " WSARecv() failed with error %d\n " , WSAGetLastError());
return 0 ;
}
}
}
}