UDP客户端的数据包分类

本文关键字:分类 数据包 客户端 UDP | 更新日期: 2023-09-27 18:03:19

我已经创建了我自己的UDP服务器/客户端,看看客户端->服务器通信是如何工作的,我想知道我是否可以使服务器读取一个特定的值…例如,我有一个登录表单,发送ID &UDP服务器的密码。如何使UDP服务器识别包含id/密码的报文?一个朋友告诉我,你可以在C/c++中设置"包头",但在c#中不行。

一些代码示例或想法将是伟大的!

UDP服务器代码:

 Configuration _conf = Configuration.Load("realmConfig.lua");
        int realmPort = _conf["AUTH"]["authPort"].GetValue<int>();
       string data = "";
    UdpClient __AUTH__ = new UdpClient(realmPort);

    IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);

    Console.WriteLine(" S E R V E R   IS   S T A R T E D ");
    Console.WriteLine("* Waiting for Client...");
    while (data != "q")
    {
        byte[] receivedBytes = __AUTH__.Receive(ref remoteIPEndPoint);
        data = Encoding.ASCII.GetString(receivedBytes);
        Console.WriteLine("Handling client at " + remoteIPEndPoint + " - ");
        Console.WriteLine("Message Received " + data.TrimEnd());
        __AUTH__.Send(receivedBytes, receivedBytes.Length,remoteIPEndPoint);
        Console.WriteLine("Message Echoed to" + remoteIPEndPoint + data);
    }
客户:

string data = "";
            byte[] sendBytes = new Byte[1024];
            byte[] rcvPacket = new Byte[1024];
            UdpClient client = new UdpClient();
            IPAddress address = IPAddress.Parse(IPAddress.Broadcast.ToString());
            client.Connect(address, 15000);
            IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);
            Console.WriteLine("Client is Started");
            Console.WriteLine("Type your message");
            while (data != "q")
            {
                data = Console.ReadLine();
                sendBytes = Encoding.ASCII.GetBytes(DateTime.Now.ToString() + " " + data);
                client.Send(sendBytes, sendBytes.GetLength(0));
                rcvPacket = client.Receive(ref remoteIPEndPoint);
                string rcvData = Encoding.ASCII.GetString(rcvPacket);
                Console.WriteLine("Handling client at " + remoteIPEndPoint + " - ");
                Console.WriteLine("Message Received: " + rcvPacket.ToString());
            }
            Console.WriteLine("Close Port Command Sent");  //user feedback
            Console.ReadLine();
            client.Close();  //close connection

UDP客户端的数据包分类

UDP/IP包头用于网络和传输目的。所有应用程序信息都应该在UDP有效负载中。你可以在那里放任何你想要的字节,使用任何你想要的结构。将有效负载看作一个非常小的文件,您可以将其从一个应用程序传递到另一个应用程序,并以与文件相同的方式构建它。例如,第一个字节可能是一个数字,表示负载其余部分的数据类型。通过这种方式,您可以创建自己的应用程序级标头。

与文件一样,您需要记住,字对齐、字节打包和端序在不同的机器上可能不相同。您正在发送一个原始字节序列,并且需要注意如何转换和解释更高级的结构。

此外,单个UDP数据报的大小非常有限。在大多数网络上,如果有效载荷大于1400字节,你就会遇到问题,最安全的做法是将有效载荷保持在512字节以下。

与UDP一样,请记住您负责所有流量控制和错误恢复。如果数据包由于任何原因丢失,您将不会收到任何通知:它只是未能到达。如果发送数据包太快,它们就会丢失。如果您不打算实现自己的专用流控制和错误恢复,请考虑使用TCP。