2012-01-15 102 views
10

什么是“正常”关闭TCP套接字的推荐方式?我已经了解到,在read()之前关闭()ing主机缓冲区中的所有剩余数据可能会导致远程主机出现问题(他可能会丢失接收缓冲区中的所有数据,尚未被他的申请阅读)。那是对的吗?正确关闭TCP套接字

什么是避免这种情况的好方法?有什么方法可以告诉API,由于忽略了任何剩余的缓冲数据并关闭了套接字,我并不在乎数据丢失吗?

或者我是否必须在应用协议级别考虑问题,并使用某种隐式或显式“传输结束”信号让对方知道关闭套接字以便读取是安全的?

+0

用什么语言? – Kiril 2012-01-15 20:19:07

+0

伯克利插座;我使用C,但我对一般概念感兴趣。 – lxgr 2012-01-15 20:23:44

回答

15

1)拨打shutdown表示您不会再向套接字写入更多数据。

2)从套接字继续到read,直到出现错误或连接关闭。

3)现在close的插座。

如果你不这样做,你可能会关闭连接,但仍然有数据需要读取。这将导致不公平的结局。

+0

好吧,我会那样做的。出于好奇:我真的有可能忽略我的接收缓冲区中的数据,而不是主机发送的数据,因为我的接收缓冲区中的数据会丢失,因此我发送到远程主机的数据可能会丢失? – lxgr 2012-01-15 20:23:13

+1

是的,您发送*到远程主机的数据可能会丢失,因为在另一侧读取数据之前可能发生无端关闭。直到您确信连接已关闭,您才想调用close。 – 2012-01-15 23:11:14

+3

1)shutdown(sock,1),2)while(read(sock,...)= 0)3)close(sock)是那个顺序吗? – ernesto 2014-02-06 06:48:37