c# - 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()
)。
如何清理服务器/套接字,以便再次创建服务器的新实例?
解决方案
造成这种情况的原因是前一个服务器实例的不正确关闭,这意味着该端口仍在被该实例使用。似乎是一个错误,内部清理工作不正常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();
它来确保在启动另一个服务器或实例之前关闭套接字。
推荐阅读
- python - ImportError:无法从“女服务员”导入名称“服务”
- excel - 无法调用用户定义的函数而不出现 NAME 错误
- docker - Docker 配置中的 Docker
- c# - 如何将依赖项添加到 ASPX 表单项目?(nuget已经尝试过)
- python - 如何在 Python 中处理嵌套字典中的嵌套列表?
- java - 检查我的当前时间是否存在于 java android 中的 7:00 PM -10.00 AM
- audio - 遍历目录中的文件以将它们拆分为 60 秒的音频文件
- python - xgboost 模型的大小是否往往很大(磁盘上的 MB)?
- ruby - Vagrant 没有遍历目录
- r - 样本之间的共同元素表