关于IO完成端口,WSASend()发送后,GetQueuedCompletionStatus一直阻塞着?求解答! 本帖最后由 oyljerry 于 2014-10-24 16:56:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先,WSASend成功了没有?其次,CreateIoCompletionPort不返回很正常,就算网络出错,也要等一段时间才会返回。最后,看看你的防火墙设置。 你的程序整个执行过程中CreateIoCompletionPort至少要执行两次第一次创建一个iocp第二次将socket绑定到这个iocp上绑定成功以后get才能获取到wsasend的回调事件 谁知道你的封装的IOCP类里怎么写的http://blog.csdn.net/VisualEleven/archive/2010/11/29/6041893.aspx int len = WSASend(sockSvr,&wsaBuf,wsaBuf.len,NULL,WSA_FLAG_OVERLAPPED,(OVERLAPPED*)&olp,NULL); 一个socket与完成端口绑定,然后即调用了 WSARecv 又调用了 WSASend 那么WSASend的参数怎么绑定给GetQueuedCompletionStatus ?WSARecv 绑定时是用了CreateIoCompletionPort((HANDLE)hSocket, m_hIOCP, (ULONG_PTR)pIoRecvContent, 0) 第三个参数绑定了iocontent ,send代码如下,这个代码是没有问题的GetQueuedCompletionStatus 能收到它的iocontent ,可是我没看见绑定iocontent 的语句啊,谁能回答一下? try { DWORD sendlen=0; for( DWORD _start=0; _start<buflen; _start+=sendlen ) { if( buflen-_start < SENDBUFLEN ) sendlen = buflen-_start; else sendlen = SENDBUFLEN; DWORD i, ok_count; IOCONTENT * iocontent; SENDBUF * sendbuf; DWORD numbytes; sendbuf=AllocSendBuf(); if(NULL==sendbuf) return 0; memcpy(sendbuf->buf, buf+_start, sendlen); sendbuf->count = (LONG)(count+1); for(i=0, ok_count=0; i<count; i++) { iocontent = AllocIOContent(); if(iocontent) { ZeroMemory(&iocontent->overlapped, sizeof(iocontent->overlapped)); if( bcolse && i >= count -1 ) iocontent->state = eIoBeconSendClose; else iocontent->state = eIoBeconSend; iocontent->sendbuf = sendbuf; iocontent->wsabuf.buf = (char *)sendbuf->buf; iocontent->wsabuf.len = sendlen; numbytes = 0; iocontent->sock = socks[i]; if( (WSASend(socks[i], &iocontent->wsabuf, 1, &numbytes, 0, &iocontent->overlapped, NULL)!=SOCKET_ERROR) ||(ERROR_IO_PENDING==WSAGetLastError()) ) { ok_count++; m_sendBufLenArray.Lock(); int sockind = m_sendBufLenArray.FindNode(socks[i]); if(-1==sockind) { sockind = m_sendBufLenArray.NewNode(socks[i],TRUE); *(m_sendBufLenArray[sockind]) = 0; } if(-1!=sockind) { (*m_sendBufLenArray[sockind]) ++; } m_sendBufLenArray.Unlock(); continue; } FreeIOContent(iocontent); } InterlockedDecrement(&sendbuf->count); } if(InterlockedDecrement(&sendbuf->count)==0) { FreeSendBuf(sendbuf); } } //关闭 if( bcolse ) { for ( DWORD i = 0; i <count; i++) { linger m_sLinger; m_sLinger.l_onoff=1; m_sLinger.l_linger=5; setsockopt(socks[i],SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger)); closesocket(socks[i]); } } return 1;//ok_count; } catch(...) { return 0; } return 0; 而且,就算绑定,因为是同一个socket 那么,怎么区别??? 估计完成端口绑定的不对吧,导致WSARecv的重叠I/O操作没有提交到完成端口。 MFC 成员变量问题 两分钟 请举例 解释 "相同的线性地址对应不同的物理地址"。。。。。。。 结构体问题!!!!!!!!!!急!!!!!!!!! 进程 树控件如何实现在每个条目前加个checkbox? 用ADO清空表中数据时出错!! 旧书换现金!!!! 求教谢谢 如何在应用程序中载入Powerpoint文档 几个关于OS的概念问题!请详细解释 VC中定义了一个长度超过1024的数组,运行出错 客户与服务器端的聊天室, 请问一个关于vc++的网络编程问题?
CreateIoCompletionPort至少要执行两次
第一次创建一个iocp
第二次将socket绑定到这个iocp上
绑定成功以后get才能获取到wsasend的回调事件
那么WSASend的参数怎么绑定给GetQueuedCompletionStatus ?
WSARecv 绑定时是用了CreateIoCompletionPort((HANDLE)hSocket, m_hIOCP, (ULONG_PTR)pIoRecvContent, 0) 第三个参数绑定了iocontent ,
send代码如下,这个代码是没有问题的GetQueuedCompletionStatus 能收到它的iocontent ,
可是我没看见绑定iocontent 的语句啊,谁能回答一下?
try
{
DWORD sendlen=0;
for( DWORD _start=0; _start<buflen; _start+=sendlen )
{
if( buflen-_start < SENDBUFLEN ) sendlen = buflen-_start;
else sendlen = SENDBUFLEN; DWORD i, ok_count;
IOCONTENT * iocontent;
SENDBUF * sendbuf;
DWORD numbytes; sendbuf=AllocSendBuf();
if(NULL==sendbuf) return 0; memcpy(sendbuf->buf, buf+_start, sendlen);
sendbuf->count = (LONG)(count+1); for(i=0, ok_count=0; i<count; i++)
{
iocontent = AllocIOContent(); if(iocontent)
{
ZeroMemory(&iocontent->overlapped, sizeof(iocontent->overlapped)); if( bcolse && i >= count -1 )
iocontent->state = eIoBeconSendClose;
else
iocontent->state = eIoBeconSend; iocontent->sendbuf = sendbuf;
iocontent->wsabuf.buf = (char *)sendbuf->buf;
iocontent->wsabuf.len = sendlen; numbytes = 0; iocontent->sock = socks[i];
if( (WSASend(socks[i], &iocontent->wsabuf, 1, &numbytes, 0, &iocontent->overlapped, NULL)!=SOCKET_ERROR)
||(ERROR_IO_PENDING==WSAGetLastError()) )
{
ok_count++; m_sendBufLenArray.Lock();
int sockind = m_sendBufLenArray.FindNode(socks[i]);
if(-1==sockind)
{
sockind = m_sendBufLenArray.NewNode(socks[i],TRUE);
*(m_sendBufLenArray[sockind]) = 0;
}
if(-1!=sockind)
{
(*m_sendBufLenArray[sockind]) ++;
}
m_sendBufLenArray.Unlock(); continue;
} FreeIOContent(iocontent);
}
InterlockedDecrement(&sendbuf->count);
} if(InterlockedDecrement(&sendbuf->count)==0)
{
FreeSendBuf(sendbuf);
}
}
//关闭
if( bcolse )
{
for ( DWORD i = 0; i <count; i++)
{
linger m_sLinger;
m_sLinger.l_onoff=1;
m_sLinger.l_linger=5;
setsockopt(socks[i],SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger)); closesocket(socks[i]);
}
} return 1;//ok_count;
}
catch(...)
{
return 0;
}
return 0;