C# UDP客户端的数据包分类
我已经创建了自己的UDP服务器/客户端,以查看客户端->服务器通信如何工作,我想知道是否可以使服务器读取特定值。。。例如,我有一个向UDP服务器发送ID和密码的登录表单。如何使UDP服务器识别包含id/密码的数据包?一位朋友告诉我,可以用C/C++设置数据包头,但不能用C 一些代码示例或想法将是伟大的 我的UDP服务器代码:C# UDP客户端的数据包分类,c#,udp,packet,C#,Udp,Packet,我已经创建了自己的UDP服务器/客户端,以查看客户端->服务器通信如何工作,我想知道是否可以使服务器读取特定值。。。例如,我有一个向UDP服务器发送ID和密码的登录表单。如何使UDP服务器识别包含id/密码的数据包?一位朋友告诉我,可以用C/C++设置数据包头,但不能用C 一些代码示例或想法将是伟大的 我的UDP服务器代码: Configuration _conf = Configuration.Load("realmConfig.lua"); int realmPort =
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);
}
UDP/IP数据包头用于网络和传输目的。所有应用程序信息都应该在UDP有效负载中。您可以使用您想要的任何结构将您想要的任何字节放在那里。将有效负载视为一个非常小的文件,从一个应用程序传递到另一个应用程序,并以与文件相同的方式构造它。例如,第一个字节可能是一个数字,指示负载其余部分中的数据类型。通过这种方式,您可以创建自己的应用程序级头 与文件一样,您需要记住,在不同的机器上,单词对齐、字节打包和endian可能不同。您正在发送一个原始字节序列,需要注意如何转换和解释更高级别的结构 此外,单个UDP数据报的大小非常有限。在大多数网络上,有效负载超过1400字节会出现问题,将有效负载保持在512字节以下是最安全的
与UDP一样,请记住,您负责所有流控制和错误恢复。如果数据包由于任何原因丢失,您将不会收到任何通知:它只是无法到达。如果你发送数据包太快,它们就会丢失。如果您不打算实现自己的专用流控制和错误恢复,请考虑使用TCP代替。但是我怎样才能准确地做出这样的事情:ifreceivedpacket==ID_PACKET{Console.WriteLineID:+nextPacket;}?我想让服务器知道,在收到ID_数据包后,下一个数据包将是ID。使用UDP,数据包可以以任何顺序到达,也可以根本不到达。您可以从完全无关的系统接收数据包。所以,无论包1中包含什么,您都无法保证包2中可能包含什么。您必须通过在发送的每个数据包的有效负载中创建和放置此类信息来管理数据包标识和排序。在这种情况下,没有理由有两个数据包。为什么不使用像ID\u PACKET=IDXXXX这样的单一有效负载呢?
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