繁体   English   中英

C#UDPClient接受任何IP地址

[英]C# UDPClient accept any IP address

我试图用C#编写3种方式的UDP打孔应用程序。 从我阅读的内容来看,步骤如下。

  1. 对等1连接到服务器
  2. 服务器说明IP地址和端口
  3. 对等2连接到服务器并获取对等1详细信息
  4. 对等2连接到对等1

我现在所拥有的是Peer 1在端口8924上连接到服务器,服务器将远程IP地址和端口详细信息写入SQL数据库。 对等2连接到服务器并请求详细信息,然后对等2使用获得的详细信息创建新的UDPClient和IPEndpoint。 到目前为止,一切似乎都正常,但是当对等2将数据发送到对等1时,什么也没有到达。

连接对等1->服务器,服务器->对等1,对等2->服务器,服务器->对等2没有问题。

在我看来,对等1不会接受来自服务器以外的其他IP地址的消息。

下面的代码是相当基本的,但是可能会给我一个错误的提示。 如果有人可以帮助我,我将不胜感激。

对等1

static void Main(string[] args)
    {
        int command = 0;
        Random r = new Random();
        while (true)
        {
            UdpClient client = new UdpClient();
            IPEndPoint serverEndpoint = new IPEndPoint(IPAddress.Parse("xxx.xxx.xxx.xxx"), 8924);
            client.Connect(serverEndpoint);
            client.Send(BitConverter.GetBytes(command), 1);
            Task.Run(() => {
                byte[] data = client.Receive(ref serverEndpoint);
                Console.WriteLine(ASCIIEncoding.ASCII.GetString(data));
                Console.ReadLine();
            });
            Console.WriteLine("sleep");
            Thread.Sleep(30000);
            Console.WriteLine("resume");

        }

    }

对等2

static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("press enter to start");
            Console.ReadLine();
            UdpClient getDetailsClient = new UdpClient();
            IPEndPoint getDetailsEndpoint = new IPEndPoint(IPAddress.Parse("xxx.xxx.xxx.xxx"), 8924);
            getDetailsClient.Connect(getDetailsEndpoint);
            getDetailsClient.Send(BitConverter.GetBytes(1), 1);
            byte[] details = getDetailsClient.Receive(ref getDetailsEndpoint);
            byte[] bIp = new byte[15];
            int port = BitConverter.ToInt32(details, 0);
            Array.Copy(details, 4, bIp, 0, 15);
            string Ip = ASCIIEncoding.ASCII.GetString(bIp).Trim();
            Console.WriteLine($"Address: {Ip} \tPort: {port}");
            UdpClient peerClient = new UdpClient();
            IPEndPoint endpointClient = new IPEndPoint(IPAddress.Parse(Ip), port);
            peerClient.Connect(endpointClient);
            peerClient.Send(ASCIIEncoding.ASCII.GetBytes("test"), 4);
            Console.ReadLine();
        }

    }

服务器

static void Main(string[] args)
    {
        int port =  8924;
        IPEndPoint remote = new IPEndPoint(IPAddress.Any, port);
        byte command;

        UdpClient server = new UdpClient(port);
        while(true)
        {
            //Wait on connection from client                
            var data = server.Receive(ref remote);
            //get command
            command = data[0];
            switch(command)
            {
                case (byte)0:
                    updateDatabase(ref server, ref remote);
                    break;
                case (byte)1:
                    readDatabase(ref server, ref remote);
                    break;
                default:
                    break;
            }

        }

    }

    private static void updateDatabase(ref UdpClient server, ref IPEndPoint remote)
    {
        Console.WriteLine("Write Command");
        using (dbDataContext db = new dbDataContext())
        {
            ConnectionTB tb = db.ConnectionTBs
                .Where(t => t.UniqueIdentifier.Trim().Equals("123456789"))
                .Select(t => t)
                .FirstOrDefault();
            tb.Port = remote.Port;
            tb.IPAddress = remote.Address.ToString();
            tb.LastPing = DateTime.Now;
            db.SubmitChanges();
            server.Send(ASCIIEncoding.ASCII.GetBytes(remote.Address.ToString().PadRight(15)),15,remote);
        }
    }

    private static void readDatabase(ref UdpClient server, ref IPEndPoint remote)
    {
        Console.WriteLine("Read Command");
        using (dbDataContext db = new dbDataContext())
        {
            ConnectionTB  p = db.ConnectionTBs
                .Where(c => c.UniqueIdentifier.Trim().Equals("123456789"))
                .Select(c => c)
                .FirstOrDefault();

            int port = p.Port.Value;
            string ip = p.IPAddress.Trim();
            byte[] data = new byte[19];
            byte[] bPort = BitConverter.GetBytes(port);
            byte[] bIp = ASCIIEncoding.ASCII.GetBytes(p.IPAddress.PadRight(15));

            Array.Copy(bPort, 0, data, 0, 4);
            Array.Copy(bIp, 0, data, 4, 15);
            server.Send(data, 19, remote);
        }
    }

@user_ABCD-事实证明您是正确的。 如果我使用套接字而不是UDPCLient,则可以不绑定而直接发送“ SendTo(EndPoint)”,这使我可以更改下一次发送的IP地址/端口,并且一切正常。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM