【问题标题】:C# UDPClient not receiving packets over external IPC# UDPClient 未通过外部 IP 接收数据包
【发布时间】:2018-01-22 15:23:38
【问题描述】:

事情就是这样,我正在为一个游戏创建服务器/客户端环境,其中端口转发的计算机充当服务器,客户端发送第一个 UDP 消息进行连接并获取接受消息,然后开始发送输入-连接成功后的游戏 UDP 消息。 问题是,当我使用本地 IP 说服务器使用 10.0.0.7 而客户端使用 10.0.0.4 时,一切正常:

  1. 客户端发送连接消息。
  2. 服务器收到它。
  3. 服务器发回接受消息。
  4. 客户收到
  5. 所有进一步的消息都毫无问题地到达两端。

但是当我使用外部IP时:

  1. 客户端发送连接消息。
  2. 服务器收到它。
  3. 服务器发回接受消息。
  4. 客户收到
  5. 两端都可以发送消息,但客户端不再接收任何消息。

最后想知道问题是出自代码,还是我认为真正出自路由器、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


【解决方案1】:

好的,经过几次尝试和错误,这对我有用...

//服务器代码

    private static UdpClient udpClient;

    static void Main(string[] args)
    {
        Console.WriteLine("Server initiated...");
        udpClient = new UdpClient(8888);
    }

    private static void ReadMessage()
    {
        while (true)
        {
            try
            {
                IPEndPoint IPEP = null;
                string message = Encoding.ASCII.GetString(udpClient.Receive(ref IPEP));
            }
        }
    }
    private static void SendUDP(IPEndPoint e,string message)
    {
        new UdpClient().Send(Encoding.ASCII.GetBytes(message), message.Length, e);
    }

//客户端代码

private IPAddress ip;

void Start()
{
    ip = Dns.GetHostAddresses("HOSTNAME")[0];
    client = new UdpClient(new IPEndPoint(IPAddress.Any, 0));
    udpThread = new Thread(new ThreadStart(ReadMessage))
    {
        IsBackground = true  
    };
    udpThread.Start();
}

private void ReadMessage()
{
    while (true)
    {
        try
        {
            IPEndPoint IPEP = null;
            byte[] data = client.Receive(ref IPEP);
            string message = Encoding.ASCII.GetString(data);
        }
    }
}
public void SendUDP(string message)
{
    client.Send(Encoding.ASCII.GetBytes(message), message.Length, new IPEndPoint(ip, 8888));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2014-06-15
    相关资源
    最近更新 更多