Не получен полный ответ от запроса rcon на сервер - PullRequest
3 голосов
/ 18 июля 2011

Я использую C # для запроса Call of Duty 4 rcon, чтобы получить статус для игроков, он работает нормально, но, похоже, не получает ответ более чем 1303 символов.

public string sendCommand(string rconCommand, string gameServerIP,
    string password, int gameServerPort)
{
    Socket client = new Socket(AddressFamily.InterNetwork,
                               SocketType.Dgram,
                               ProtocolType.Udp);
    client.Connect(IPAddress.Parse(gameServerIP), gameServerPort);

    string command;
    command = "rcon " + password + " " + rconCommand;
    byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
    byte[] bufferSend = new byte[bufferTemp.Length + 4];

    bufferSend[0] = byte.Parse("255");
    bufferSend[1] = byte.Parse("255");
    bufferSend[2] = byte.Parse("255");
    bufferSend[3] = byte.Parse("255");
    int j = 4;

    for (int i = 0; i < bufferTemp.Length; i++)
    {
        bufferSend[j++] = bufferTemp[i];
    }

    IPEndPoint RemoteIpEndPoint
        = new IPEndPoint(IPAddress.Parse(gameServerIP), 0);
    client.Send(bufferSend, SocketFlags.None);
    byte[] bufferRec = new byte[64999];
    client.Receive(bufferRec);
    return Encoding.ASCII.GetString(bufferRec);
}

Видимо, у других людей с этим проблем нет, но у меня проблемы с этим.У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 18 июля 2011

Моя память по протоколу Quake RCON туманна, но я считаю, что специальный заголовок составляет 5 байт, 0xFF 0xFF 0xFF 0xFF 0x02.Если это не относится к COD4, игнорируйте этот совет.

Кроме того, вы не можете полагаться на все данные, полученные за один вызов Socket.Receive.И мой опыт работы с Quake RCON не всегда лучший в возвращении, «как и ожидалось».

byte[] bufferSend = new byte[bufferTemp.Length + 5 ];
bufferSend[0] = 0xFF;
bufferSend[1] = 0xFF;
bufferSend[2] = 0xFF;
bufferSend[3] = 0xFF;
bufferSend[4] = 0x02;
Buffer.BlockCopy(bufferTemp, 0, bufferSend, 5, bufferTemp.Length);
...

StringBuilder response = new StringBuilder();
byte[] bufferRecv = new byte[65536];
do
{
    // loop on receiving the bytes
    int bytesReceived = client.Receive(bufferRecv);

    // only decode the bytes received
    response.Append(Encoding.ASCII.GetString(bufferRecv, 0, bytesReceived));
} while (client.Available > 0);

return response.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...