【问题标题】:Lidgren create server instance for a second time results in System.Net.Sockets.SocketExceptionLidgren 第二次创建服务器实例导致 System.Net.Sockets.SocketException
【发布时间】:2020-07-08 12:51:29
【问题描述】:

我在 Monogame 中使用 Lidgren。 玩家有可能想要主持一场比赛,然后离开大厅,并想再次主持。但是,当我在我的代码中执行此操作时,会引发以下异常:System.Net.Sockets.SocketException: '每个套接字地址(协议/网络地址/端口)通常只允许使用一次'

相关代码:

// initializing the server
NetPeerConfiguration _config = new NetPeerConfiguration("some app id");
// code to enable certain messages.
_server = new NetServer(_config);
_server.Start();

// cleaning up the server instance
_server.Shutdown("server shutdown");
_server = null;

代码在_server.Start() 处因绑定套接字而崩溃。(m_socket.Bind())。

如何清理服务器/套接字,以便再次创建服务器的新实例?

【问题讨论】:

  • 还有其他人遇到这个问题吗?有 40 次观看,并且(此时)有两个赞成票..
  • 我认为正在发生的事情是,您每次播放器想要托管时都在重新创建服务器,因此它不会记住您已经绑定了端口。然后它试图再次绑定端口,所以它失败了。我认为你应该尝试只调用一次new NetServer,就像在构造函数中一样 - 并删除_server = null。然后使用_server.Start();_server.Shutdown("...") 打开和关闭服务器。
  • 让我想想这是否有助于解决您的问题,如何使用线程一次并行处理多个请求。

标签: c# sockets monogame lidgren


【解决方案1】:

造成这种情况的原因是前一个服务器的实例不正确关闭,这意味着该端口仍在被该实例使用。 好像是个bug,内部清理没有正常工作https://github.com/lidgren/lidgren-network-gen3/issues/94 https://github.com/lidgren/lidgren-network-gen3/issues/94#issuecomment-369561026 但是它已修复,因此请确保拥有最新版本的 lidgren-network https://github.com/RevoluPowered/lidgren-network/tree/feature/socket-overhaul

您可以使用_server.Socket.Close(); 来确保套接字在启动另一个服务器或实例之前关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多