socket编程中FIN

服务端发送了一个FIN给客户端,此时客户端socket接收缓冲区中还有一些数据,当调用ReadLine的时候,返回EOF吗?

FIN是TCP连接关闭时,TCP协议层发送的一种协议。socket相关的函数是不会将这些数据扔给应用程序的。如果你这时候进行socket操作(不管是接收还是发送),函数都会返回-1。
EOF是读文件时文件末尾的结束符标志,与socket没有关系。追问

客户端输入 ctrl+d 不就是发送EOF给服务端了吗?

追答

ctrl+D实际上是作为数据发给负责处理数据的应用程序,如果你用网络抓包工具看的话,应该看到的是一个TCP包,里面的数据是ctrl+D。
如果ctrl+D能让应用程序关闭TCP连接,那么也应该是应用程序在收到这个数据后,把ctrl+D翻译成关闭TCP连接的命令,然后才执行了TCP的关闭操作。
应用层是不能介入TCP层数据收发细节的,在ISO 7层网络框架中,它们分属不同的层。

追问

按下ctrl+d后:

对端使用read读套接字的时候,顺序是不是这样:

TCP协议栈发送一个EOF给read, read返回0,服务端程序退出,然后 TCP协议栈发送FIN ACK 给客户端。至此 连接断开。

追答

差不多。准确的说是服务端程序退出时调用了关闭SOCKET的操作函数,然后才有后面的TCP FIN消息。

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网