首页 > 解决方案 > Lidgren 第二次创建服务器实例导致 System.Net.Sockets.SocketException

问题描述

我在 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())。

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

标签: c#socketsmonogamelidgren

解决方案


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

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


推荐阅读