2012-08-16 62 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