1.我在调用send的时候好像重来不会阻塞,send是不是有个buffer,放进buffer后send函数就返回了,buffer中的内容会等对方来拿?那什么时候send会阻塞?2.关于recv对方发过来的东西是不是在本机的buffer中?当buffer空时recv函数就阻塞?3.以上两个问题加起来,send和recv如果都有buffer,那么数据什么时候从一个buffer到另外一个buffer?

解决方案 »

  1. 1.当send()的buffer满的时候会阻塞。
    2.应该是放在本机的buffer,当buffer空时recv()不是阻塞而是挂起。
    3.当send()成功的时候。
      

  2. xift_2008
    你回答的第一个问题和第三个问题矛盾,根据你的回答:
    1.send在buffer满的时候阻塞,那不满的时候就立即返回了,返回的时候数据在buffer中
    3.send成功时,数据已经不在本机buffer中了,已在对方buffer中
    所以你的回答矛盾
      

  3. xift_2008说的没错,是你自己理解有问题
    1、立即返回就表示成功
    2、xift_2008说的SEND成功是指实际上的成功
      

  4. send返回成功,只是表示把数据成功放入send buffer。
    是否真的成功无法得知,只有靠应用层上的接收响应。
      

  5. 呵呵~~~
    多谢几位的指教,是我没有说清楚。
    send()返回成功是把数据成功放入了send buffer中,send buffer
    会自动去按固定数据长度取出数据发送,理论上TCP的话接收端肯定
    能收到数据(当然是在链路正确建立的情况下,有网络延时是很正
    常),但UDP情况下就不一定了,可能会出现收不到的现象。
      

  6. send成功只是表明数据成功的放入了buffer
      

  7. 阻塞模式下,buffer中没有数据时,recv就一直在等待
      

  8. 当 send 成功将数据写入发送缓冲区之后 , 函数就成功返回了。 这时对方能不能收到还不一定。
    当发送缓冲区满的时候, send 会阻塞。 直到发送缓冲可以写入数据为止。 发送如果缓冲不足以写入所有的数据,send 写入一些数据,填满缓冲,返回写入的字节数,所以,如果send 返回的字节数不等于指定的字节数,应该再次调用,直到写入全部的数据为止。当接收缓冲中有数据时, recv 函数会取出这部分数据,然后返回取出的字节数。 如果recv 指出的内存太小,不足以保存所有接收到的数据。那么,只会返回一部分接收缓冲内的数据。你可能需要再次调用recv 来接收剩余的数据。 如果接收缓冲空了,在阻塞模式下,recv 会阻塞,直到有数据到来。在非阻塞模式下。recv 会返回0字节。 在阻塞模式下,如果recv 返回0字节,说明对方已经调用 closesocket关闭了套接字,  如果不是对方主动关闭,而是其它原因引起的套接字断开,则recv 返回SOCKET_ERROR, 此时 WSAGetLastError 能返回正确的原因。 网络中断引起的套接字断开,在默认的情况下,要很长时间(5分钟左右吧)才能被双方检测到。
      

  9. 谢谢各位了,那各位高手都来看看这道题吧http://community.csdn.net/Expert/topic/3979/3979946.xml?temp=.8236811
    连上服务器的时候,服务器那边send了两条信息,由于到达的时间不确定,所以会出现两种情况,请问,怎么样处理这种情况啊?
      

类似问题 »