IOCP WSASend遇到的奇怪问题? 本帖最后由 VisualEleven 于 2011-04-26 11:36:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是 由于多次发送出现的原因啊?我才刚刚接触IOCP。。下面是一段IOCP的代码,英文注释你看看。。 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 ; } } } } 你的lpOverlapped关联的Overlapped关联的确定是发送,不是接收?? 没有重复发送,Overlapped关联的是发送,不是接收 内存访问断点, 看谁改了m_wsabuf.len, 应该就知道怎么回事了 VC中如何打开文件夹(相对路径)? 关于一个SDI视图分割的问题 为什么没有关闭程序? 如何制作XP风格的CHM C++支持正则表达式吗? windows附件里的 計算其代碼 求助!!!急....高手指教 数值转换 一个关于脚本的问题 list控件选择问题 关于GetProcAddress获取函数地址的问题 求教VC2008下遇到的字符16进制对比怪事
我才刚刚接触IOCP。。下面是一段IOCP的代码,英文注释你看看。。
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 ;
}
}
}
}