什么是“正常”关闭TCP套接字的推荐方式?我已经了解到,在read()之前关闭()ing主机缓冲区中的所有剩余数据可能会导致远程主机出现问题(他可能会丢失接收缓冲区中的所有数据,尚未被他的申请阅读)。那是对的吗?正确关闭TCP套接字
什么是避免这种情况的好方法?有什么方法可以告诉API,由于忽略了任何剩余的缓冲数据并关闭了套接字,我并不在乎数据丢失吗?
或者我是否必须在应用协议级别考虑问题,并使用某种隐式或显式“传输结束”信号让对方知道关闭套接字以便读取是安全的?
什么是“正常”关闭TCP套接字的推荐方式?我已经了解到,在read()之前关闭()ing主机缓冲区中的所有剩余数据可能会导致远程主机出现问题(他可能会丢失接收缓冲区中的所有数据,尚未被他的申请阅读)。那是对的吗?正确关闭TCP套接字
什么是避免这种情况的好方法?有什么方法可以告诉API,由于忽略了任何剩余的缓冲数据并关闭了套接字,我并不在乎数据丢失吗?
或者我是否必须在应用协议级别考虑问题,并使用某种隐式或显式“传输结束”信号让对方知道关闭套接字以便读取是安全的?
1)拨打shutdown
表示您不会再向套接字写入更多数据。
2)从套接字继续到read
,直到出现错误或连接关闭。
3)现在close
的插座。
如果你不这样做,你可能会关闭连接,但仍然有数据需要读取。这将导致不公平的结局。
好吧,我会那样做的。出于好奇:我真的有可能忽略我的接收缓冲区中的数据,而不是主机发送的数据,因为我的接收缓冲区中的数据会丢失,因此我发送到远程主机的数据可能会丢失? – lxgr 2012-01-15 20:23:13
是的,您发送*到远程主机的数据可能会丢失,因为在另一侧读取数据之前可能发生无端关闭。直到您确信连接已关闭,您才想调用close。 – 2012-01-15 23:11:14
1)shutdown(sock,1),2)while(read(sock,...)= 0)3)close(sock)是那个顺序吗? – ernesto 2014-02-06 06:48:37
用什么语言? – Kiril 2012-01-15 20:19:07
伯克利插座;我使用C,但我对一般概念感兴趣。 – lxgr 2012-01-15 20:23:44