我用recv()接收数据,可是总是不完整,而如果我在前面加入Sleep(500)就没有问题了,请问这是怎么回事?有没有更好的解决办法?

解决方案 »

  1.   

    tcp是流方式的,recv()返回接收到的字符数,你检查不够就再接收一次。
      

  2.   

    这是你的逻辑流程没有处理对
    你可以用Event(事件)+计算Byte来确保数据的接受  typedef struct{
        DWORD dwDataLength;  //告诉接受方接下来要发过来的数据大小
        TCHAR szSynaMark[8]; //同步标志
        ...
       }_PACKET1;
    把第一个数据包发过去然后等待对方确认收到了第一个数据包
    然后分多次或一次发要传输的数据包
       typedef struct{
        DWORD dwDataLength;  //告诉接受方本次发过来的数据大小
        TCHAR szSynaMark[8]; //同步标志
        ...
        TCHAR szData[DATA_SIZE]; //数据
       }_PACKET2接受的时候用dwDataLength来判断是否收完,如果数据很大
    那么收到一定程度就可以用一个线程去处理收到的数据.
      

  3.   

    试试WasyncSelectEVENT,在这个函数中可以指定自己感兴趣的下一事件,可以指定FD_READ.并自定义消息响应函数.这样当缓冲区中有数据就回通知你,直到没数据.
    #defin wm_myread wm_user+101//自定义消息afx_msg lresult onmyread(wparam,lparam);//自定义消息响应函数
    on_message(wm_myread,onmyread);//自己插入消息映射//连接成功后,调用
    wsaynseletnextevent(hwnd,wm_myread,0,0,fd_read);
    afx_msg lresult onmyread(wparam,lparam)
    {读取数据
    }