2011-04-22 76 views
0

我在FreeBSD中遇到了關於xSocket close()方法的問題。儘管我在Google上搜索它,但我找不到任何滿意的解決方案。讓我詳細解釋一下這個問題。FreeBSD socket關閉問題

我有一個打開端口和監聽連接的代碼。我爲此使用了xSocket。尤其是這是用於多人遊戲。當用戶想要設置遊戲時,我爲用戶分配端口,用戶可以創建遊戲並等待其他玩家。當玩家關閉他的網頁瀏覽器或者如果創建的遊戲中的在線玩家人數小於1,則從遊戲中退出遊戲。我通過應用ondiscoonect方法關閉端口。這種方法清除對象並使遊戲端口關閉。儘管代碼說端口已關閉,但它並不完全關閉。在第一次創建遊戲後,如果另一個用戶想要創建一個新遊戲,則會出現端口已被使用的錯誤(java.net.BindException)。

INFO: server (0.0.0.0:20051) has been shutdown 
Apr 22, 2011 9:20:09 AM org.xsocket.connection.IoAcceptor <init> 
WARNING: could not bind server to 0.0.0.0/0.0.0.0:20051. Reason: java.net.BindException: Address already in use 
     at sun.nio.ch.Net.bind(Native Method) 
     at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:119) 
     at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59) 
     at org.xsocket.connection.IoAcceptor.<init>(IoAcceptor.java:117) 
     at org.xsocket.connection.IoAcceptor.<init>(IoAcceptor.java:94) 
     at org.xsocket.connection.IoProvider.createAcceptor(IoProvider.java:453) 
     at org.xsocket.connection.Server.<init>(Server.java:492) 
     at org.xsocket.connection.Server.<init>(Server.java:169) 
     at   .engine.communication.Game.closeGame(Game.java:246) 
     at   .engine.communication.Game.disconnect(Game.java:209) 
     at   .engine.communication.Lounge.disconnect(Lounge.java:238) 
     at   .engine.Engine.disconnect(Engine.java:102) 
     at .engine.communication.gameSocketDataHandler.onDisconnect(gameSocketDataHandler.java:235) 
     at org.xsocket.connection.HandlerAdapter.performOnDisconnect(HandlerAdapter.java:334) 
     at org.xsocket.connection.HandlerAdapter.access$300(HandlerAdapter.java:42) 
     at org.xsocket.connection.HandlerAdapter$PerformOnDisconnectTask.run(HandlerAdapter.java:317) 
     at org.xsocket.SerializedTaskQueue.performPendingTasks(SerializedTaskQueue.java:161) 
     at org.xsocket.SerializedTaskQueue.access$100(SerializedTaskQueue.java:40) 
     at org.xsocket.SerializedTaskQueue$MultithreadedTaskProcessor.run(SerializedTaskQueue.java:189) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
     at java.lang.Thread.run(Thread.java:619) 

因爲它可以在跟蹤中可以看出的異常代碼中的線的該方法的遊戲class.The代碼246拋出低於;

public void closeGame() { 
    try { 

     server.close(); 
     System.out.println("Opened?"+server.isOpen()); 
     LoungeManager.removeGame(loungeId, gameId); 
    } catch (Exception ex) { 
     String err = "Game.closeGame:" + ex.getMessage(); 
     err += logGame.exceptionTrace(ex); 
     logGame.appendLog(err, Severity.FATAL); 
    } 
} 

感謝您的幫助,再次感謝網站的計算器。這個問題可以說有點長,但我希望自己可以理解。我在等你的建議。

kingspeech

+2

[編程的第一條規則:這是總是你的錯](http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html) - 查找'SO_REUSEADDR' – 2011-04-22 06:47:21

+2

我用FreeBSD很多。你能爲這個「流行的bug」提供一個參考嗎? – 2011-04-22 06:48:13

+0

感謝adirau的幫助。 – kingspeech 2011-04-22 06:48:27

回答

2

FreeBSD在關閉套接字方面相當不錯,我不認爲這個問題是操作系統。

設置服務器套接字時,在綁定之前調用setReuseAddress(true)。操作系統必須保留之前的{srcip,srcport,dstip,dstport}元組超出服務器套接字句柄的生命週期;重用地址選項允許您在存在此服務器套接字時設置另一個服務器套接字。

2

我在linux的C++項目中遇到同樣的問題。

,幫助我的唯一的事情是

setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) 

結合

更新前:

這是不是一個錯誤,它是一個功能