Socket服务器无法同时监听两个端口,绑定第二个端口时报错如何解决?
问题描述
我编写了一个Socket连接库,单个连接运行正常。代码如下:
public static bool StartServer(string _strPort, string _strIpAddress_Optional, out string strInfo) { try { StrPort = _strPort; StrIpAddress_Optional = _strIpAddress_Optional; // Data buffer for incoming data. byte[] bytes = new Byte[BufferSize]; IPAddress ipAddress; if (String.IsNullOrEmpty(StrIpAddress_Optional) || StrIpAddress_Optional.Trim() == "-1") ipAddress = IPAddress.Parse(GetLocalIPAddress()); else ipAddress = IPAddress.Parse(StrIpAddress_Optional); int port = int.Parse(_strPort); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); if (listener == null) listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(localEndPoint); listener.Listen(100); listener.BeginAccept(new AsyncCallback(AcceptCallbackServer), listener); strInfo = "address " + ipAddress + " port "+ port; return true; } catch (Exception exc) { strInfo = exc.Message; return false; } }
单独执行AsynchronousServer.StartServer("23", "127.0.0.1", out strInfo);或AsynchronousServer.StartServer("24", "127.0.0.1", out strInfo);均正常,但同时执行这两句时,第二个调用会在listener.Bind处抛出“An invalid argument was supplied”错误。请问如何让服务器绑定两个不同的端口?
解决方案
问题核心是listener为静态变量:第一次调用StartServer时创建Socket实例并绑定了端口23,第二次调用时因为listener不为null,直接复用这个已绑定的Socket去绑定新端口24——而一个Socket实例只能绑定一个端点,这就导致了错误。
解决方法很直接,去掉静态listener的复用逻辑,每次调用StartServer都创建新的Socket实例:
public static bool StartServer(string _strPort, string _strIpAddress_Optional, out string strInfo) { try { StrPort = _strPort; StrIpAddress_Optional = _strIpAddress_Optional; // Data buffer for incoming data. byte[] bytes = new Byte[BufferSize]; IPAddress ipAddress; if (String.IsNullOrEmpty(StrIpAddress_Optional) || StrIpAddress_Optional.Trim() == "-1") ipAddress = IPAddress.Parse(GetLocalIPAddress()); else ipAddress = IPAddress.Parse(StrIpAddress_Optional); int port = int.Parse(_strPort); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); // 直接创建新的Socket实例,不再复用静态listener Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(localEndPoint); listener.Listen(100); listener.BeginAccept(new AsyncCallback(AcceptCallbackServer), listener); strInfo = "address " + ipAddress + " port "+ port; return true; } catch (Exception exc) { strInfo = exc.Message; return false; } }
额外注意两点:
- 如果需要管理多个Socket实例,建议维护一个静态集合(比如
List<Socket>)存储所有创建的listener,方便后续统一关闭或管理。 - 确保
AcceptCallbackServer回调逻辑能正确处理不同Socket的连接,避免共享静态变量导致的逻辑混乱。
内容的提问来源于stack exchange,提问作者user4367090
相关产品推荐
相关产品推荐

