【发布时间】:2011-11-23 06:58:49
【问题描述】:
我不确定如何在 TCP 中判断发件人何时完成向我发送信息。
比如A需要向B发送200字节,B如何知道A发送完毕,信息准备好传输到应用层了?
有 FIN 标志,但据我所知,它只是象征着你要关闭连接。
谢谢。
【问题讨论】:
-
你把它留给更高级别的协议。
标签: networking tcp stream protocols
我不确定如何在 TCP 中判断发件人何时完成向我发送信息。
比如A需要向B发送200字节,B如何知道A发送完毕,信息准备好传输到应用层了?
有 FIN 标志,但据我所知,它只是象征着你要关闭连接。
谢谢。
【问题讨论】:
标签: networking tcp stream protocols
当发送者在连接上完成发送数据时,TCP 没有义务告诉接收者。它不能,因为它不了解它正在传输的更高级别的协议数据。
但是它会告诉你连接是否关闭(然后你会在网络跟踪中看到一个 FIN、FIN-ACK)序列。从编程的角度来看,假设您使用的是 C,当对等方关闭连接时,函数 recv 将返回 0。
【讨论】:
您定义一个协议,例如首先以指定的字节顺序发送一个 4 字节的 int,该字节顺序指示消息正文中将跟随多少字节。
【讨论】:
如果您使用的是 unix/linux,select 和 poll 可以向您发出信号,表明另一端已完成传输(完成了一半/完全关闭)。 read 如果您已读取所有数据并希望从已关闭的连接中读取,也会返回错误。
如果您在一个连接上进行多次传输并希望发出“包”结束的信号,则必须将其构建到您的协议中。
【讨论】: