gpt4 book ai didi

c# - C#UDPClient未通过外部IP接收数据包

转载 作者:行者123 更新时间:2023-12-03 12:08:48 27 4
gpt4 key购买 nike

事情就是这样,我正在为游戏创建服务器/客户端环境,其中端口转发的计算机充当服务器,客户端发送第一个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);
    }

    最佳答案

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

    //服务器代码

        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));
    }

    关于c# - C#UDPClient未通过外部IP接收数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48384927/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com