簡體   English   中英

關閉連接后無法通過本地端口連接

[英]Cannot connect via local port after closing connection

如本文http://www.brynosaurus.com/pub/net/p2pnat/中所述,我正在嘗試對NAT的TCP孔打孔進行原型制作。

我有一段簡單的代碼,試圖在特定的本地端口上打開到服務器的連接。 我正在嘗試在公共服務器上觀察NAT是否將兩個連接都映射到相同的NAT映射。

int localPort = getFreeLocalPort();

     while (true) {

        Socket connection = new Socket(_publicServerHost,_publicServerPort,
                 getLocalSocketAddress(), localPort);

        connection.setReuseAddress(true);

        connection.close();

     }

第一次連接良好。 但是第二次嘗試會引發異常:

選擇用於打孔的本地端口:65416

2012-06-17 15:55:21,545錯誤-地址已在使用中:連接

2012-06-17 15:55:25,175調試-詳細信息:java.net.BindException:地址已在使用中:在java.net.PlainSocketImpl.socketConnect(本機方法)處進行連接〜[na:1.6.0_24]在java.net處.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)〜[na:1.6.0_24]在java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)〜[na:1.6.0_24]在java.net.PlainSocketImpl.connect (PlainSocketImpl.java:200)〜[na:1.6.0_24]在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)〜[na:1.6.0_24]在java.net.Socket.connect(Socket.java :529)〜[na:1.6.0_24]在java.net.Socket.connect(Socket.java:478)〜[na:1.6.0_24]在java.net.Socket。(Socket.java:375)〜 na:1.6.0_24],位於java.net.Socket。(Socket.java:249)〜[na:1.6.0_24]

嘗試添加connection.setSoLinger(true, 0); 直接在connection.close();之前。

像這樣:

connection.setSoLinger(true, 0);
connection.close();

這將強制OS釋放套接字。

在什么基礎上選擇了本地端口? 顯然不是一個聲音。 如果完全需要,最好讓系統選擇它,方法是指定零,並在打開后套接字獲取實際值。

您解決了問題嗎? 應該在分配端口之前調用setReuseAddress()。

Socket connection = new Socket();
connection.setReuseAddress(true);
connection.bind( ...);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM