2012-08-16 53 views
0

我在linux中实现了一个在少数端口上侦听的转发代理。无论何时发生连接,它都会进入外部世界。 我的设置如下所示:代理内部的关闭套接字

Outerworld < ----->代理(侦听端口A)< ------->浏览器(配置了代理设置toPort A)

然而,我不确定何时关闭代理外部世界和代理浏览器之间的连接。 我的印象是,如果我看到数据大小为0的数据包(recv()),那么它就是客户端通信的结束。一旦我得到“recv()= 0”,我会与外部世界“close()”。这是正确的方法吗?或者我应该做关机()?另外,我认为有时浏览器会发送一个带有数据包的“FIN”,但我无法捕捉到它。我有时会看到从未关闭的套接字上的浏览器连接。 (Linux重用相同的fd号码,这就是其中一个原因,我相信我错过了套接字关闭。)

哪里可能会出错。

感谢

回答

2

对于一个普通的TCP代理,关机就是用正确的事情。当您从一侧读取EOF时,请停止阅读该侧并关闭另一侧的文字。然后你可以继续阅读和写作另一个方向,直到它也给你一个EOF,然后你关闭两个。

+1

您将执行读取操作,获取最终数据,将其写入其他套接字,执行另一次读取操作,获取EOF并执行关闭操作。 – 2012-08-17 04:12:53

+0

嘿Alan,所以只是为了澄清:“世界(www_sockfd)<-->(client_sockfd)代理服务器(server_sockfd)<-->(browser_sockfd)浏览器”现在,如果我recv()在server_sockfd上返回0,那么我需要在写入(client_sockfd)时关闭。有一次,我recv(),在client_sockfd上的0个字节,然后在client_sockfd和server_sockfd上关闭()。这是正确的吗? – 2012-08-17 23:00:58