读书人

发一发 WSARecv 回来0的时候的体会

发布时间: 2012-09-08 10:48:07 作者: rapoo

发一发 WSARecv 返回0的时候的体会
重叠 io winsock :




If no error occurs and the receive operation has completed immediately, WSARecv returns

这是msdn 的解释WSARecv的返回值的意思



问题1: 是否可以再返回0的时候就可以直接读取处理数据呢?




依然不行,如我提供的代码,则是有问题的:

nRet= WSARecv(g_ol[nPos]->sock, &(g_ol[nPos]->wsaBuf), 1, &dwTrans, &dwFlags, &(g_ol[nPos]->ol), NULL);

if(nRet==0) //成功
{
if(dwTrans>0)
printf("没有异步,收到的远程主机:%s ----端口: %d发送过来的数据为:%s\n",inet_ntoa(g_ol[nPos]->sockaddr.sin_addr),ntohs(g_ol[nPos]->sockaddr.sin_port), g_ol[nPos]->szBuf);
else
printf("没有异步,远程主机:%s ----端口%d: 发送过来的数据为空\n",inet_ntoa(g_ol[nPos]->sockaddr.sin_addr),ntohs(g_ol[nPos]->sockaddr.sin_port));

printf("离开第%d个连接\n",nPos);
continue;
}





问题2:

int WSARecv(
_In_ SOCKET s,
_Inout_ LPWSABUF lpBuffers,
_In_ DWORD dwBufferCount, //这个参数: 如何使用?
_Out_ LPDWORD lpNumberOfBytesRecvd,
_Inout_ LPDWORD lpFlags,
_In_ LPWSAOVERLAPPED lpOverlapped,
_In_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);



试验可以证明,当这个参数》0的时候, 缓冲区依然可能是空的!!!

所以 对于返回0的情况,是不够直接去 使用缓冲区的, 还有个参数也是不能使用的,使用则会出错


上面那段代码依然可以 用来解释 为什么这个参数是没有意义的


说的不对,高手跟正


问题3: 如果WSAWaitForMutipleEvents 超时的时候如何 解决? 这个不会,望高手指点

如果超时只是简单的打印一个错误日志,有什么意义呢? 数据依然收不到,对吧 ?



[解决办法]
1、创建一个套接字,开始在指定的端口上监听连接请求。
2、接收一个入站的连接请求。
3、为接受的套接字创建新的WSAOVERLAPPED结构,并分配事件对象句柄。
4、以WSAOVERLAPPED结构为参数,在套接字上投递WSARecv调用。
5、将所有接受套接字的事件组建事件数组,并调用WSAWaitForMultipleEvents函数,等待与重叠调用关联在一起的事件受信。
6、使用WSAGetOverlappedResult函数,判断重叠调用的返回状态。
7、重新组建事件数组。
8、在套接字上重投递WSARecv请求。
9、重复5~8。

步5~8可以建另外一程A行,主程管理接,程A接收并投到程。

哈。有不懂的可以研究下文章。
http://www.cnblogs.com/my_life/articles/1982091.html

读书人网 >VC/MFC

热点推荐