问一个关于send和recv的问题,3个小问题100分?

时间:2020-12-30 17:37:45
1.我在调用send的时候好像重来不会阻塞,send是不是有个buffer,放进buffer后send函数就返回了,buffer中的内容会等对方来拿?那什么时候send会阻塞?

2.关于recv对方发过来的东西是不是在本机的buffer中?当buffer空时recv函数就阻塞?

3.以上两个问题加起来,send和recv如果都有buffer,那么数据什么时候从一个buffer到另外一个buffer?

9 个解决方案

#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了两条信息,由于到达的时间不确定,所以会出现两种情况,请问,怎么样处理这种情况啊?

#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了两条信息,由于到达的时间不确定,所以会出现两种情况,请问,怎么样处理这种情况啊?