手上有个mfc版的smtp类,但是因为需要,想改成api版的,于是发现了个奇怪的问题:
用csocket类接受服务器返回的数据是完整的,而用api“recv”时发现每次只收到4个字节。请问csocket的“Receive”与api“recv”有什么区别?怎样才能使”recv“一次接受完整个数据?以下为csocket的数据
220 126.com Anti-spam GT for Coremail System (126com[071018])EHLO 220.181.15.113250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
。。
以下为recv的数据:
220 
126.
com 
Anti注意:我用的是126的邮箱做测试。
单步执行和抓包都是这个结果

解决方案 »

  1.   

    do{
    ret=::select(0,&fdRead,NULL,NULL,&TimeOut);
    if(ret==SOCKET_ERROR)
    break;
    if(ret>0)
    {
    if(nLeft==0)
    ret=::recv(m_sock,pBuffer,sizeof(PACKHEADER),0);
    else
    ret=::recv(m_sock,pBuffer+idx,nLeft,0);
    if(ret==0) //对方连接中断
    ret=SOCKET_ERROR;
    if(ret==SOCKET_ERROR)
    break;
    if(nLeft==0)
    nLeft=pHead->length;
    else
    nLeft-=ret;
    idx+=ret;
    }
    else
    break;
    }while(nLeft>0);
      

  2.   

    我后来用select把问题解决了,可以发送成功,但是不知道为什么会出现上面的结果。
    按理说抓包工具是截取了recv的调用,而csocket是socket的封装,抓的包应该是一样的结果啊?
      

  3.   

    这个没有区别,CSocket:Receive和recv都有可能只收到部分字节,这是TCP天然的特点
    你需要不停的收,直到你收到需要的字节数网上有很多关于“粘包”的文章就是关于这个的
      

  4.   

    sizeof(PACKHEADER) 的大小是多少呢 ,可能每次只收取4字节的数据。直接改成一个较大的数据试一下.