2011-04-22 81 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) 

结合

更新前:

这是不是一个错误,它是一个功能