[英]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.