原文“send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;”
问题:  如果发送大文件,len大于s的发送缓冲区的长度,那么直接发送是行不通的么?也就是调用该函数就只是返回而不做其他数据操作?

解决方案 »

  1.   

    这句话不全对
    UDP有个最大包(65535个字节),如果发送数据超过这个数,那么就如LZ所说
    TCP没有那个限制,我试过一次发送4M的数据,都正确接收了,所以没有问题
      

  2.   

    哦,忘了这个讨论的一个环境是指“同步Socket的send"
      

  3.   

    原文的环境说明了是“同步Socket的send”,这个环境是不是就是TCP阻塞方式了?TCP阻塞方式如果发送大文件,len大于s的发送缓冲区的长度,那么直接发送是行不通的么?也就是调用该函数就只是返回而不做其他数据操作?
      

  4.   

    对于TCP,也是有这样的限制的,和同步非同步应该没有什么关系。这还是牵涉到一个系统的发送缓冲区,该缓冲区有一个默认的大小,默认的大小大概是8.5KB左右。如果一次发送一个非常大的数据包,有可能是会出现发送不完全的现象。但是不一定会出现。
    但对于未知的错误我们都需要应对:
    所以如果发送较大的文件,需要以这样的方式send:
                            //      while(needlen>0)
    // {
    // ret=send(thissocket,&(buffer[j]),needlen,0);
    // if(ret==0)
    // {
    // //;
    // }
    // else if(ret==SOCKET_ERROR)
    // {
    // //;
    // }
    // needlen-=ret;
    // j+=ret;
    // }明白了吗
      

  5.   

    阻塞方式应该是这样的
    会返回WSAENOBUFS错误
    假如是非阻塞就会返回发送的字节所以大文件发送要求你自己分片
      

  6.   

    你可以看看MSDN中send解释
    If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode
      

  7.   

    我的理解:分两种情况,阻塞方式和非阻塞方式。
    如果你的socket是阻塞方式的,那么send函数会停在这里,一直到有充足的空间存放你的数,函数才返回;
    如果是非阻塞方式,那么函数会马上返回SOCKET_ERROR,如果调用WSAGetLastError(),返回值是WSAEWOULDBLOCK,表示“无法立即完成一个非阻挡性套接字操作。”
    如有错误,请大牛们指正~~
      

  8.   

    我TCP阻塞,没有修改默认缓冲区大小,一次send了100M,也能成功