C # - Невозможно получить ответ сервера от UDP - Black Ops Rcon - PullRequest
3 голосов
/ 14 ноября 2010

Я создаю веб-приложение RCON для Call of Duty Black Ops. ХПК использует пакеты rcon и udp для отправки и получения информации. Используя следующий код, я смог отправлять и получать информацию с сервера COD4. Теперь, когда нет COD7, я больше не получаю ответы обратно.

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.Connect(IPAddress.Parse(gameServerIP), gameServerPort);

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

//intial 5 characters as per standard
bufferSend[0] = byte.Parse("255");
bufferSend[1] = byte.Parse("255");
bufferSend[2] = byte.Parse("255");
bufferSend[3] = byte.Parse("255");
bufferSend[4] = byte.Parse("02");
int j = 5;

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

//send rcon command and get response
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
client.Send(bufferSend, SocketFlags.None);

//big enough to receive response
byte[] bufferRec = new byte[65000];
client.Receive(bufferRec);            

У кого-нибудь есть идеи? Black Ops поставляется с собственным инструментом Rcon, который я пытался использовать Wireshark для захвата исходящих пакетов для копирования. Исходящие пакеты между моим приложением и их приложениями идентичны, за исключением того, что я не получаю ответов, когда использую свои.

Ответы [ 4 ]

3 голосов
/ 19 ноября 2010

Я знаю, почему я сам создаю инструмент.

Что не так в вашем коде, так это: bufferSend [4] = byte.Parse ("02");

хорошийis: bufferSend [4] = byte.Parse ("00");

Попробуйте, у меня работает!

1 голос
/ 20 ноября 2010

Вот мой кусок кода, я использую поток для его запуска:

как это сделать:

в вашем классе установите частную команду, затем вызовите работника, когда закончите поток,просто прочитайте частный ответ.

      private IPEndPoint ipendpoint;
      private string command;
      private string response;

      private void worker()
      {
        UdpClient client = new UdpClient();
        var result1 = string.Empty;
        var result2 = string.Empty;
        bool sent = false;
        bool DoubleTrame = false;
        Byte[] bufferTemp = Encoding.ASCII.GetBytes(this.command);
        Byte[] bufferSend = new Byte[bufferTemp.Length + 5];
        Byte[] bufferRec;
        Byte[] bufferRec2;

        bufferSend[0] = Byte.Parse("255");
        bufferSend[1] = Byte.Parse("255");
        bufferSend[2] = Byte.Parse("255");
        bufferSend[3] = Byte.Parse("255");
        bufferSend[4] = Byte.Parse("00");

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

        while (!sent)
        {
            client.Send(bufferSend, bufferSend.Length, ipendpoint);
            Thread.Sleep(200);
            if (client.Available > 0)
            {
                sent = true;
                if (client.Available > 1200)
                {
                    DoubleTrame = true;
                }
            }
        }
        bufferRec = client.Receive(ref ipendpoint);
        if (DoubleTrame)
        {
            bufferRec2 = client.Receive(ref ipendpoint);
            result2 = Encoding.ASCII.GetString(bufferRec2);
            if (result2.Contains("\n\n"))
            {
                result2 = result2.Remove(result2.IndexOf("\n\n"));
            }
            result2 = result2.Substring(12);
        }
        result1 = Encoding.ASCII.GetString(bufferRec);
        this.response = result1 + result2;
      }
0 голосов
/ 19 ноября 2010

На самом деле, я сделал то же самое, что и вы, я использовал WireShark для просмотра байта, отправленного и полученного с помощью функции rconTool по умолчанию в паре для Black Ops.

Другой совет:

Команда «status» дает вам много информации о текущих игроках, но не о команде каждого из них.

Вместо этого лучше использовать «teamstatus», этот дает вам ту же информацию, но с командой каждого игрока.

У меня сейчас проблемы с идеальным разбором ответа, но для получения понятного ответа используйте это:

замените:

    byte[] bufferRec = new byte[65000];
    client.Receive(bufferRec);  

на:

      byte[] bufferRec;
            while (client.Available == 0)
            {
                Thread.Sleep(10);
            }
        client.Receive(bufferRec);  
string response=Encoding.ASCII.GetString(bufferRec);
var list= response.Split('\n');

Таким образом, у вас будет массив с каждым игроком, отдельным в ряду.

Кстати: я мак, я сейчас зарегистрирован, не был этой ночью

Редактировать: да, я не заметил, что вы уже попробовали команду teamstatus.

Вам нужно посмотреть на число, возвращаемое клиентом. Доступно, потому что сервер отправляет только 1168 байт за раз, так что если клиент.Avalaible> 1168, вам нужен второй буфер для получения второго fнизкий с client.receive.

На самом деле есть только два возможных числа для client.avalaible: 1168 и 2336 (да, двойное), я не знаю почему, но им не удалось отправить точноечисло данных, буфер всегда заполнен или пуст.

Я также заметил, что второй receive () похож на "вставку" в первый буфер.

Вы будете иметь в hte begginigдополнительная информация первого метода Receive (), а затем «шума» старого.

Просто взгляните, вы поймете, что я имею в виду.

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

0 голосов
/ 14 ноября 2010

Я делаю то же самое, используя vb.net. Я написал rcon инструменты для COD MW и COD WW без проблем, однако до сих пор я не смог получить ответ от моего сервера black ops.

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