首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-09-08 
发一发WSARecv返回0的时候的体会重叠 iowinsock :If no error occurs and the receive operation has comp

发一发 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

热点排行