You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:30:02