UDP客户端的数据包分类

时间:2014-05-13 12:25:55

标签: c# udp packet

我已经创建了自己的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

1 个答案:

答案 0 :(得分:0)

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

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

此外,各个UDP数据报的大小非常有限。在大多数网络中,您将遇到大于1400字节的有效负载问题,并且最有效的是将有效负载保持在大约512字节以下。

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