Как разобрать простой пакет UDP? - PullRequest
0 голосов
/ 15 марта 2011

Я пытаюсь собрать быстрый сервер удаленной консоли в следующий час как можно быстрее, но столкнулся с проблемой.

Я использую этот очень простой пакетный протокол ... http://www.codeproject.com/KB/game/gameRcon.aspx

Я получил приличное начало (я уверен, что есть лучший способ проверить первые 5 байтов, но я довольно плохо знаком с C # и спешу.

Как правильно разделить оставшуюся строку пакета? После этих 5 байтов это должен быть пробел, затем «rcon passwordhere», затем пробел, а остальное я могу взять как одну строку. В основном мне просто нужно получить часть «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 ]

4 голосов
/ 15 марта 2011

Ну, во-первых, вы хотите превратить остаток вашего байтового массива в строку:

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
2 голосов
/ 15 марта 2011

Глядя на протокол "RCON", похоже, что он использует кодировку ASCII для строковых данных ..

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

Затем делайте со строкой все, что вам нравится, разделяйте, повторяйте и т. Д. ...

1 голос
/ 15 марта 2011

Возможно, вы захотите использовать UTF8 вместо ASCII.Предполагается, что в первых 5 байтах или в пароле нет пробелов.

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