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/IP包头用于网络和传输目的。所有应用程序信息都应该在UDP有效负载中。你可以在那里放任何你想要的字节,使用任何你想要的结构。将有效负载看作一个非常小的文件,您可以将其从一个应用程序传递到另一个应用程序,并以与文件相同的方式构建它。例如,第一个字节可能是一个数字,表示负载其余部分的数据类型。通过这种方式,您可以创建自己的应用程序级标头。
与文件一样,您需要记住,字对齐、字节打包和端序在不同的机器上可能不相同。您正在发送一个原始字节序列,并且需要注意如何转换和解释更高级的结构。
此外,单个UDP数据报的大小非常有限。在大多数网络上,如果有效载荷大于1400字节,你就会遇到问题,最安全的做法是将有效载荷保持在512字节以下。
与UDP一样,请记住您负责所有流量控制和错误恢复。如果数据包由于任何原因丢失,您将不会收到任何通知:它只是未能到达。如果发送数据包太快,它们就会丢失。如果您不打算实现自己的专用流控制和错误恢复,请考虑使用TCP。