我的程序是一个十分简单的telnet客户端
先是用winsocket的connect()连接23端口
然后用recv()接受数据问题是,如果我connect()成功后马上开始循环调用recv()收数据
发现第一次收只会收到3个byte(对方发送过来的数据肯定大于3个)
但若在connect()和recv()间先sleep个几秒后则能正常收取数据
请问这是何故?-----部分代码-----------
WSAStartup(0x0101,&wd);
                char pBuf[128]; CSocketDx SocketDx("166.111.8.238", IPPORT_TELNET);
m_hSocket = SocketDx.TelnetConnect(); Sleep(5000);//不加这句,第一次nRet就只等于3

while ((nRet = recv(m_hSocket,pBuf,sizeof(pBuf),0)) > 0)
{
if (nRet < sizeof(pBuf))
{
pBuf[nRet] = '\0';
ofile.Write(pBuf, nRet);
break;
}

if ( SOCKET_ERROR == nRet)
{
break;
}
ofile.Write(pBuf, nRet);
}

解决方案 »

  1.   

    网络速度慢,不要使用这种方法.
    使用非阻塞,的select或者其他 IO模型
      

  2.   

    因为你阻塞的情况下不知道收多少内容才算结束,所有recv不一定非要等到指定的长度才返回的.
      

  3.   

    循环调用recv直到数据全部接收完
      

  4.   

    循环调用recv直到数据全部接收完
    ---
    可怎样才算全部接收完?当recv()返回等于0么?可我发现如果没有数据可收,程序会阻塞在recv(),并不会返回0
      

  5.   

    TCP是stream,没有消息边界,你的数据包要自定义一个格式,让程序可以分析什么时候是一个完整消息。比方字符串协议用\n来结尾一个消息,二进制协议开头先发送消息长度。
      

  6.   

    是的  不是网络的原因  
    我telnet的设备只有1米多的网线 也要Sleep(3000);左右才会收到数据  。
    我想socket就是这样的吧  。LZ可以使用多线程 。