服务端发送了一个FIN给客户端,此时客户端socket接收缓冲区中还有一些数据,当调用ReadLine的时候,返回EOF吗?
FIN是TCP连接关闭时,TCP协议层发送的一种协议。socket相关的函数是不会将这些数据扔给应用程序的。如果你这时候进行socket操作(不管是接收还是发送),函数都会返回-1。
EOF是读文件时文件末尾的结束符标志,与socket没有关系。追问
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消息。
温馨提示:答案为网友推荐,仅供参考