如何解析简单的UDP数据包?

时间:2011-03-15 03:49:50

标签: c# networking udp packet

我想尽快在下一个小时内将快速远程控制台服务器放在一起,但遇到了问题。

我正在使用这个非常简单的数据包协议...... http://www.codeproject.com/KB/game/gameRcon.aspx

我有一个不错的开始(我确信这是一个更好的方法来检查前5个字节,但我对C#相当新,并且匆忙。

如何正确拆分其余的数据包字符串?在那5个字节之后,它应该是一个空格,然后是“rcon passwordhere”,然后是空格,那么我可以把剩下的作为单个字符串。我主要只需要在此之后获取“密码”部分和其余数据包作为字符串。

public void StartServer()
{
    System.Text.ASCIIEncoding encode = new System.Text.ASCIIEncoding();

    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 28960);
    UdpClient socket = new UdpClient(ipep);

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

    // Receive Packet
    byte[] data = socket.Receive(ref sender);

    if (data[0] == byte.Parse("255") &&
        data[1] == byte.Parse("255") &&
        data[2] == byte.Parse("255") &&
        data[3] == byte.Parse("255") &&
        data[4] == byte.Parse("02"))
    {
        // Check Password String

        // Execute Command
    }
}

3 个答案:

答案 0 :(得分:4)

好吧,首先,您要将字节数组的其余部分转换为字符串:

var text = encode.GetString(data, 5, data.Length - 5);

然后您可以将其拆分为命令(" rcon"),密码和其余部分。这里最简单的方法是将字符串拆分为空格字符,但指定您希望返回的元素不超过3个(因此最终元素可能包含更多空格):

var segments = text.Split(new[] {' '}, 3);
// segments[0] is assumed to be "rcon"
// segments[1] is the password
// segments[2] is the remainder of the string

答案 1 :(得分:2)

查看“RCON”协议,看起来它正在使用ASCII编码作为字符串数据..

string theString = System.Text.Encoding.ASCII.GetString(data.Skip(5).ToArray());

然后用字符串,拆分,迭代等做任何你喜欢的事情......

答案 2 :(得分:1)

您可能希望使用UTF8代替ASCII。这假设前5个字节或密码中没有空格。

string str = System.Text.Encoding.ASCII.GetString(data);
string[] items = str.Split(' ');
string password = items[2];
相关问题