Добрый день дорогие пользователи Zhyk.ru сегодня мы научимся получать информация о сервере использующий UDP протокол с помощью языка c#
Для примера я возьму сервер Counter-Strike.
Для этого нам понадобится MVS n-версии,я использую 2008.
Точные действия по гайду.
Создаем новый проект ConsoleApplication.
В пространства имен добавим нужные нам
Было -
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
Стало -
Код:
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
В теле метода main -
Код:
static void Main(string[] args)
{
//Тело метода...
}
Добавим -
Код:
Socket Sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Тем самым инициализируем новый сокет на протоколе UDP.
Теперь нам нужно найти любой сервер. Я возьму - 212.76.142.82:27077
Вернемся в метод main и напишем следующие.
Код:
try { Sock.Connect("77.220.182.153", 27015); }
catch (Exception ex) { Console.WriteLine(ex.Message); }
В блоке try/catch мы пытаемся подключится к серверу для дальнейшых действий. Если же мы не подключились на консоль выведется причина.
Далее нам нужно узнать какой пакет отвечает за получение информации.
Я воспользовался WPE и нашел нужный нам пакет.
Его значения в 16-тиричной системе -
Код:
FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00
В строковом значении -
Код:
....TSource Engine Query.
Теперь нам нужно отправить данный пакет,у нас есть два варианта действий: перевести "....TSource Engine Query" в 16-тиричной систему и отправить.
Либо использовать уже готовый пакет
А именно -
Код:
FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00
поскольку тело пакет статично.
В блоке try пишем -
Код:
byte[] Send = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x00 };
Наш пакет готов к отправке
Все в том же блоке try пишем -
Тем самым отправляем пакет.
Далее нужно получить ответ.
Все в том же блоке try пишем -
Код:
byte[] Response = new byte[256];
int packetLen = 0;
packetLen = Sock.Receive(Response);
Array.Resize(ref Response, packetLen);
Инициализируем массив(byte) с кол-во 256-ти сегментов.
Инициализируем переменную для хранения длинны пакета.
Получам ответ.
Изменяем размер массив если длинна пакета меньше кол-во сегментов.
Далее переводим наш ответ в понятный нам вид
Все тот же блок try -
Код:
string enc_Response = Encoding.ASCII.GetString(Response);
Инициализируем переменную, записываем перекодированный пакет из byte в string.
Далее отпарсим ответ и выведем его не консоль -
Все тот же блок try -
Код:
[string[] split = enc_Response.Split('\0');
Console.WriteLine("Имя сервера - " + split[1]+"\n");
Console.WriteLine("Карта - " + split[2] + "\n");
Как видно мы получили Имя сервера и текущую карту
Для того что бы получить список игроков нам будет нужен несколько иной пакет -
Код:
byte[] Player = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, (byte)'p', (byte)'i', (byte)'n', (byte)'g', 0x00 };
Я думаю что вам не составит труда получить список распарсить и вывести
Полный код программы -
Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Socket Sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try
{
Sock.Connect("212.76.142.82", 27077);
byte[] Send = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x20, 0x45, 0x6E, 0x67, 0x69, 0x6E, 0x65, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x00 };
Sock.Send(Send);
byte[] Response = new byte[256];
int packetLen = 0;
packetLen = Sock.Receive(Response);
Array.Resize(ref Response, packetLen);
string enc_Response = Encoding.ASCII.GetString(Response);
string[] split = enc_Response.Split('\0');
Console.WriteLine("Имя сервера - " + split[1]+"\n");
Console.WriteLine("Карта - " + split[2] + "\n");
byte[] Player = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, (byte)'p', (byte)'i', (byte)'n', (byte)'g', 0x00 };
Console.ReadLine();
}
catch (Exception ex) { Console.WriteLine(ex.Message); }
}
}
}
зы Ответ от сервера не статичен по этому для каждого сервера метод парсинга ответа может быть разным
За все время прибывания на Жуке это мой первый гайд
Спасибо за внимание