【发布时间】:2018-01-22 15:23:38
【问题描述】:
事情就是这样,我正在为一个游戏创建服务器/客户端环境,其中端口转发的计算机充当服务器,客户端发送第一个 UDP 消息进行连接并获取接受消息,然后开始发送输入-连接成功后的游戏 UDP 消息。 问题是,当我使用本地 IP 说服务器使用 10.0.0.7 而客户端使用 10.0.0.4 时,一切正常:
- 客户端发送连接消息。
- 服务器收到它。
- 服务器发回接受消息。
- 客户收到
- 所有进一步的消息都毫无问题地到达两端。
但是当我使用外部IP时:
- 客户端发送连接消息。
- 服务器收到它。
- 服务器发回接受消息。
- 客户收到
- 两端都可以发送消息,但客户端不再接收任何消息。
最后想知道问题是出自代码,还是我认为真正出自路由器、NAT、防火墙或类似的东西。 (注:客户端发送到服务器的 8888 端口,服务器通过客户端的本地端口返回,应该是这样。)
以下是为 Unity 编写的客户端代码:
void Start()
{
client = new UdpClient();
client.Connect(IPAddress.Parse("<Global IP>"), 8888);
client.BeginReceive(new AsyncCallback(ReadMessage), client);
}
private void ReadMessage(IAsyncResult result)
{
IPEndPoint ipEndPoint = null;
string message = Encoding.ASCII.GetString(client.EndReceive(result, ref ipEndPoint));
print("Got: " + message);
string[] wholeMessages = message.Split('#');
for (int w = 0; w < wholeMessages.Length - 1; w++)
{
string[] parts = wholeMessages[w].Split('$');
if (!connected && parts.Length == 3 && parts[0] == "accept" && int.TryParse(parts[1], out ID))
{
connected = true;
code = parts[2];
}
}
client.BeginReceive(new AsyncCallback(ReadMessage), client);
}
public void SendUDP(string message)
{
client.Send(Encoding.ASCII.GetBytes(message), message.Length);
}
【问题讨论】:
-
你也可以添加服务器代码吗?
-
我仍在学习消息结构和拆分等。pastebin.com/AAgz5Nun 它适用于 localhost 和 LAN(10.0.0.5、10.0.0.1)内部,但不适用于全局 IP,在它只接收第一条消息的全局 IP,虽然尝试在 Wireshark 上检查内容并且计算机得到了它们,但不是应用程序。
-
这是一个 Unity 游戏顺便说一句..
-
在您的客户端,而不是使用 IPAddress.Parse,如果您使用 IPAddress[] ip = Dns.GetHostAddresses(ipAddress); 会发生什么client.Connect(ip[0], 8888);还可以尝试遍历 ip 数组并打印它返回的内容
-
只有一个IP,同一个IP。
标签: c# visual-studio sockets unity3d udp