当前位置: 代码迷 >> VC/MFC >> 这么recv是否正确
  详细解决方案

这么recv是否正确

热度:134   发布时间:2016-05-02 03:23:48.0
这样recv是否正确?
本帖最后由 VisualEleven 于 2015-07-25 09:02:48 编辑
是服务器端的程序,使用的是TCP协议,非阻塞方式。接收缓冲区为buf, 需要接收的字节数为n,程序如下;

case WM_SOCKET:
{
     switch(LOWORD(lParam))
     {
     case FD_READ:
     {
          int iRecv = 0, iret;
          while(iRecv < n)
          {
          if((iret = recv(wParam, buf + iRecv, n - iRecv, 0)) == SOCKET_ERROR)
               if(WSAGetLastError() == WSAEWOULDBLOCK)
                    continue;
               else
                    goto close;
          iRecv += iret;
          }
     }
     }
}

我的想法是,当服务器收到FD_READ消息时,用recv接收数据。需要接收的数据是n字节,缓冲区是buf,已经接收的字节是iRecv,这样的话,接收缓冲区就应该写成buf + iRecv(对吗?),而接收字节数就应该写成n - iRecv(对吗?)

这样while循环下去(其实很有可能一次就完成了,接收的数据量很小,几十个字节),如果收不到足够的字节数,它就会一直在这里面循环。而不会退出此消息处理(这样做对吗?会不会造成死循环?这样做似乎是非得收到iRecv,否则不退出循环)。


------解决思路----------------------
这个while是没必要的
你需要的是一个数据缓冲区
然后把接收到的数据全部塞到里面
档处理完一帧数据后,把那段数据删除
------解决思路----------------------
你每个客户端来了都是一个独立的缓冲区
另外我建议你的服务端用client模型
客户端用server模型
然后你的服务端启动后向client端发udp请求过来连接
然后建立稳定的TCP通信