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