日期:2014-05-16  浏览次数:20854 次

UNIX/Linux 下socket() 编程里面send() 和recv() 数据顺序问题?
一个问题大家讨论下:
socket 编程里面,如果使用TCP 通信机制,服务器和客户端建立好连接后。

如果服务器端不断使用send() 函数向客户端发送数据,而客户端也一直使用recv() 接收这些数据的情况下,客户端接收到的数据一定和服务器端send() 的数据顺序是一致的吗?会不会出现网络阻塞在原因或者其他原因使其数据丢失,而少接收到一条数据。

例如:如果服务器端顺序使用send() 给客户端发送1,2,3,4,.... 客户端会不会出现接收到的数据是:1,4,2,3,....这样的情况?

大家随便发言啊,踊跃发表各自的看法啊。

------解决方案--------------------
看代码实现,没有定论。

有序应答是常见的,实现无序应答需要携带请求唯一ID标识,一般使用uint64。
------解决方案--------------------
当然是有序的。

上面版主讲的是另外一个意思
------解决方案--------------------
有序的, TCP内部会保障.
------解决方案--------------------
TCP协议决定了收包是有序的,
------解决方案--------------------
tcp是流协议,如果对方没有收到, 对端会要求重传的,顺序是有保证的
------解决方案--------------------
是的,tcp能保证消息的时序, 掉包会重传, udp丢包,需要自己逻辑层做处理,协议本身不保证时序,也不保证不丢包
------解决方案--------------------
协议层肯定是有序的, 我说的应用层报文的序列。
------解决方案--------------------
协议本身不保证时序,网络数据都是BIGENDIAN