网络结构:阻塞式的,有连接的TCP  我调用send()函数发送一个12M大小文件的时候每次函数都立刻返回,并不阻塞在那里,且返回值就是12M缓冲区的大小,为什么呢?我用的是默认的send()函数,就是阻塞式的。是不是什么地方还要设置?
  另外,就算我在发送之前把网线拔了,send()依旧出现上面的情况,难道send()函数返回的不是真实发送的字节数??

解决方案 »

  1.   

    一次发送的数据太大
    The send function is used to write outgoing data on a connected socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying provider, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.
      

  2.   

    To goodboyws(深夜不眠者):
    “the error WSAEMSGSIZE is returned” ?? 我说了返回值是12M,而并不是WSAEMSGSIZE“no data is transmitted” ?? 但是我发送的12M的包客户端完整的接收到了。
      

  3.   

    1.我发送的SOCKET是这样得到的:
        SOCKET sock;
        sock = accept(...);
      这样得到的SOCKET是非阻塞的吗??2.服务器端send()立刻返回,但客户端recv()要等一会儿才能收到
      

  4.   

    1.我发送的SOCKET是这样得到的:
        SOCKET sock;
        sock = accept(...);
      这样得到的SOCKET是非阻塞的吗??
    ----------------------------------------
    这要看建立监听程序是不是阻塞才可确定。
      

  5.   

    我只是想检测一下一次发12M的数据可不可以,程序还可以改。现在的问题是既然send()是把要发送的数据放到系统的发送缓冲之后就返回,那我通过什么方法能得知系统发送缓冲中的数据成功发送了呢??
      

  6.   

    To lianglp():
      我的监听程序是先声明一个SOCKET,然后bind(),然后listen(),然后accept()。在这个过程中使用的都是最基本的调用方式,没有使用任何的select(),完成端口,重叠I/0等。这样的默认应该是阻塞式的吧??
      

  7.   

    如果你没调用wsaeventselect()和ioctr..()(记不清了,就是设置blocking的那个),应该是BLOCKING的。
      

  8.   

    如果你是在本地调试,
    也就是IP地址是127。0。0。1,
    那么非常正常,因为本地环路的传递速度可以达到30M/S以上,如果CPU性能够强,还能更快,
    所以你一次SEND,还来不及缓冲满就已经被发送光了。
      

  9.   

    我也很想知道这个问题~~我用的是WSASend发送,发送之后调用WSAGetOverlappedResult等待WSASend完成~~按照道理来说,WSAGetOverlappedResult返回之后,那么数据应该是到达了目标机器~但是有的时候接收端的数据依然接收不完整~~~我是发送的文件,不存在粘包的问题~~何解?
      

  10.   

    我也遇到了这个问题,查阅了一些资料,send的阻塞应该这样来看你是公司的老板,socket是个文员现在你要把一个buffer发送给A公司的老板,现在你跑到文员那,说我要发送一个buffer给A公司的老板
    出现的情况,
    1,假设现在文员正空闲呢(缓冲区没有数据,或者缓冲区的数据大于你的buffer),然后文员说,交给我吧,你回去吧,这就是为什么马上返回的原因
    2,假设现在文员手头有很多buffer没发呢,文员告诉你,你等着,我前面的还没有发完,你在这阻塞一会吧,等我发完了前面的,待我的缓冲大于你的buffer的时候再。。应该就是这个意思,文员假设在规定时间内没有发送完成,应该回来告诉你发送失败的,只是这个我不知道怎么做