【发布时间】:2020-07-26 02:56:24
【问题描述】:
我正在尝试在我的计算机上运行游戏 TCP/UDP 服务器。它在本地网络中运行良好,但是当我尝试使用我的公共 IP 运行服务器时,它就无法正常工作。我尝试禁用路由器中的防火墙,为端口 17000 设置端口转发,并向我的计算机添加防火墙规则。我的电脑也绑定了IP。
我使用 Wireshark 检查了客户端调用,发现客户端(Unity 游戏)正在向我的 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);
}
【问题讨论】:
-
这很可能是因为监听套接字只绑定在本地网络接口上。试试
new TcpListener(IPAddress.Any, Port); -
@Asti 不起作用,我想我需要将其设置为静态地址,因为路由器正在将其端口转发到该地址,对吧?
-
Any应该适用于所有网络地址。您是否使用第三方工具检查过是否可以从外部访问 TCP 服务器? -
好吧,我检查了那个端口,它被“过滤”了。所以我猜它仍然是关闭的,但我不知道为什么,因为路由器应该转发那个端口。