在我的计算机上托管C#的公共TCP服务器

在我的计算机上托管C#的公共TCP服务器,c#,tcp,server,udp,C#,Tcp,Server,Udp,我正在尝试在我的计算机上运行游戏TCP/UDP服务器。它在本地网络中运行良好,但当我试图用我的公共IP运行服务器时,它就是不工作。我已尝试禁用路由器中的防火墙,为端口17000设置端口转发,并在计算机中添加了防火墙规则。我还将IP绑定到我的计算机 我已经用Wireshark检查了客户端调用,发现客户端(Unity game)正在向我的IP发送数据,但它给它尝试发送的每个TCP数据包提供TCP重新传输错误 有些代码来自服务器和客户端 服务器IP设置为192.168.0.*:17000 客户端正在使

我正在尝试在我的计算机上运行游戏TCP/UDP服务器。它在本地网络中运行良好,但当我试图用我的公共IP运行服务器时,它就是不工作。我已尝试禁用路由器中的防火墙,为端口17000设置端口转发,并在计算机中添加了防火墙规则。我还将IP绑定到我的计算机

我已经用Wireshark检查了客户端调用,发现客户端(Unity game)正在向我的IP发送数据,但它给它尝试发送的每个TCP数据包提供TCP重新传输错误

有些代码来自服务器和客户端

服务器IP设置为192.168.0.*:17000

客户端正在使用端口17000连接到我的IP

服务器:

public static void Start(byte _maxPlayers)
    {
        MaxPlayers = _maxPlayers;
        Port = 17000;

        Console.WriteLine("Starting server..");
        InitializeServerData();

        tcpListener = new TcpListener(GetLocalIPAddress(), Port);
        tcpListener.Start();
        tcpListener.BeginAcceptTcpClient(new AsyncCallback(TCPConnectCallback), null);

        udpListener = new UdpClient(Port, GetLocalIPAddress().AddressFamily);
        udpListener.BeginReceive(UDPReceiveCallback, null);

        Console.WriteLine($"Server started on {tcpListener.LocalEndpoint}.");
    }
public void Connect()
    {
        socket = new TcpClient
        {
            ReceiveBufferSize = dataBufferSize,
            SendBufferSize = dataBufferSize
        };

        receiveBuffer = new byte[dataBufferSize];
        socket.BeginConnect(instance.ip, instance.port, ConnectCallback, socket);
    }

    private void ConnectCallback(IAsyncResult _result)
    {
        socket.EndConnect(_result);

        if (!socket.Connected)
            return;

        stream = socket.GetStream();

        receivedData = new Packet();

        stream.BeginRead(receiveBuffer, 0, dataBufferSize, ReceiveCallback, null);
    }
客户端:

public static void Start(byte _maxPlayers)
    {
        MaxPlayers = _maxPlayers;
        Port = 17000;

        Console.WriteLine("Starting server..");
        InitializeServerData();

        tcpListener = new TcpListener(GetLocalIPAddress(), Port);
        tcpListener.Start();
        tcpListener.BeginAcceptTcpClient(new AsyncCallback(TCPConnectCallback), null);

        udpListener = new UdpClient(Port, GetLocalIPAddress().AddressFamily);
        udpListener.BeginReceive(UDPReceiveCallback, null);

        Console.WriteLine($"Server started on {tcpListener.LocalEndpoint}.");
    }
public void Connect()
    {
        socket = new TcpClient
        {
            ReceiveBufferSize = dataBufferSize,
            SendBufferSize = dataBufferSize
        };

        receiveBuffer = new byte[dataBufferSize];
        socket.BeginConnect(instance.ip, instance.port, ConnectCallback, socket);
    }

    private void ConnectCallback(IAsyncResult _result)
    {
        socket.EndConnect(_result);

        if (!socket.Connected)
            return;

        stream = socket.GetStream();

        receivedData = new Packet();

        stream.BeginRead(receiveBuffer, 0, dataBufferSize, ReceiveCallback, null);
    }

所以我发现,我设置了两个路由器,因为我在一个路由器上转发端口17000,所以它不工作

这种情况很可能发生,因为侦听套接字仅绑定在本地网络接口上。尝试
新的TcpListener(IPAddress.Any,Port)
@Asti它不工作,我想我需要将它设置为静态地址,因为路由器正在端口将它转发到该地址,对吗?
任何
都应该适用于所有网络地址。您是否使用第三方工具检查过是否可以从外部访问TCP服务器?那么,我已经检查了该端口,它是“过滤”的。所以我猜它仍然关闭,但我不知道为什么,因为路由器应该转发那个端口。