Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 6

SA-MP Query на Си

05.04.2014, 22:06. Показов 3848. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите реализовать отправку пакета и получение данных о сервере на Cи. Я могу отправить UDP пакет, но не могу правильно сформировать пакет... Help me!

P.S. http://wiki.sa-mp.com/wiki/Que... nse_from_i

Вот мой код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#define _SCR_SECURE_NO_WARNINGS
 
#include <Windows.h>
#include <iostream>
#include <winsock.h>
 
#pragma comment(lib, "Wsock32.lib")
 
#define HOST "127.0.0.1"
#define PORT 7777
 
struct stServer
{
    char hostname[32];
    char mapname[32];
    char host[32];
    int port;
    int players;
    int max_players;
};
 
 
int main()
{
    WSAData wsa;
    SOCKADDR_IN sAddr;
    SOCKET sock;
 
    if (FAILED(WSAStartup(MAKEWORD(1, 1), &wsa))) return FALSE;
 
    sAddr.sin_addr.S_un.S_addr = inet_addr(HOST);
    sAddr.sin_port = htons(PORT);
    sAddr.sin_family = AF_INET;
 
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) return FALSE;
 
    char packet[] = { "" }; // как он черт возьми формируется ? :)
 
    sendto(sock, packet, sizeof(packet), 0, (sockaddr*)&sAddr, sizeof(sAddr)); // отправляем сформированный пакет
 
    char buf[1024];
    recv(sock, buf, sizeof(buf), 0); // читаем ответ от сервера
    
    for (int i = 0; i < sizeof(buf); i++)
    {
        if (buf[i] == 0) break;
        printf("%s\n", buf[i]); //выводим
    }
 
    closesocket(sock);
    WSACleanup();
    system("pause");
    return TRUE;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2014, 22:06
Ответы с готовыми решениями:

Shodanhq - ошибка Error: Invalid search query, please check the query syntax
Собственно, такая проблема. Я думаю, что многие знакомы с такой поисковой системой, как shodanhq.com. В последнее время при поиске у меня...

Не работает $db->query(); // Call to a member function Query() on a non-object in
Только приступил к ООП, поэтому очевидно наличие простых ошибок. Вот код, который при запуске метода $User-&gt;registr(); Выодает ошибку:...

User Warning: Query Error:In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated colu
Добрый вечер! Получаю такую ошибку: User Warning: Query Error:In aggregated query without GROUP BY, expression #2 of SELECT list contains...

5
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 6
06.04.2014, 23:08  [ТС]
_up_
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
07.04.2014, 14:51
Цитата Сообщение от sk1x Посмотреть сообщение
char packet[] = { "" }; // как он черт возьми формируется ?
а что Вы хотите передать?, раз Вы создали сокет как SOCK_DGRAM значит Ваши данные буду завернуты с udp, т.е вам формировать заголовок udp не надо, а только передать данные которые будут в пакете
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 6
07.04.2014, 19:15  [ТС]
Есть код PHP
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$sIPAddr = "127.0.0.1";                                                         // IP address of the server
$iPort = 7777;                                                                  // Server port.
$sPacket = "";                                                                  // Blank string for packet.
 
$aIPAddr = explode('.', $sIPAddr);                                              // Exploding the IP addr.
 
$sPacket .= "SAMP";                                                             // Telling the server it is a SA-MP packet.
 
$sPacket .= chr($aIPAddr[0]);                                                   //
$sPacket .= chr($aIPAddr[1]);                                                   //
$sPacket .= chr($aIPAddr[2]);                                                   //
$sPacket .= chr($aIPAddr[3]);                                                   // Sending off the server IP, 
 
$sPacket .= chr($iPort & 0xFF);                                                 //
$sPacket .= chr($iPort >> 8 & 0xFF);                                            // Sending off the server port.
 
$sPacket .= 'i';                                                                // The opcode that you want to send.
                                                                                // You can now send this to the server.
 
/**
 *    Let's connect now to the server.
 */
$rSocket = fsockopen('udp://'.$sIPAddr, $iPort, $iError, $sError, 2);           // Create an active socket.
fwrite($rSocket, $sPacket);
Нужно написать аналогию на C
0
0 / 0 / 0
Регистрация: 04.04.2014
Сообщений: 6
08.04.2014, 20:39  [ТС]
uppp
0
1 / 1 / 0
Регистрация: 24.03.2013
Сообщений: 19
04.05.2014, 00:46
Если в ответе строки не оканчиваются нулем, то как-то так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#define _SCR_SECURE_NO_WARNINGS
 
#include <Windows.h>
#include <iostream>
#include <winsock.h>
 
#pragma comment(lib, "Wsock32.lib")
 
#define HOST "127.0.0.1"
#define PORT 7777
#define RESPONCE_HEADER_SIZE 11
#define RESPONCE_STR_MAXLEN 32
 
#pragma pack(push,1) // отключаем выравнивание
 
typedef struct samp_query_s
{
    char header[4];
    unsigned int ip;
    short port;
    char code;
} samp_query_t;
 
typedef struct iresponce_s
{
    char has_password;
    short players;
    short maxplayers;
 
    char hostname[RESPONCE_STR_MAXLEN];
    char gamemode[RESPONCE_STR_MAXLEN];
    char mapname[RESPONCE_STR_MAXLEN];
} iresponce_t;
 
#pragma pack(pop)
 
int main()
{
    WSAData wsa;
    SOCKADDR_IN sAddr;
    SOCKET sock;
    samp_query_t query;
    char buf[1024];
    int received;
    unsigned int len;
    char *pos, *end;
    iresponce_t responce;
 
    if (FAILED(WSAStartup(MAKEWORD(1, 1), &wsa))) return 1;
 
    inet_pton(AF_INET, HOST, &sAddr.sin_addr);
    sAddr.sin_port = htons(PORT);
    sAddr.sin_family = AF_INET;
 
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) return 1;
 
    memcpy(query.header, "SAMP", 4);
    query.ip = sAddr.sin_addr;
    query.port = sAddr.sin_port;
    query.code = 'i';
 
    sendto(sock, (const char *)&query, sizeof(query), 0, (sockaddr*)&sAddr, sizeof(sAddr)); // отправляем сформированный пакет
    received = recv(sock, buf, sizeof(buf), 0); // читаем ответ от сервера
    closesocket(sock);
    WSACleanup();
 
    if (received < (RESPONCE_HEADER_SIZE+1+2+2+4))
        return 1;
 
    end = buf + received;
    pos = buf + RESPONCE_HEADER_SIZE;
    memcpy(&responce, pos, 5); // read password and players
    pos += 5;
    
    // read hostname
    len = *( unsigned int *)pos;
    pos += 4;
    if( pos + len + 4 >= end )
        return 1;
    memcpy(&responce.hostname, pos, len = MIN(len,RESPONCE_STR_MAXLEN-1));
    responce.hostname[len] = '\0';
    pos += len;
 
    // read gamemode
    len = *( unsigned int *)pos;
    pos += 4;
    if( pos + len + 4 >= end )
        return 1;
    memcpy(&responce.gamemode, pos, len = MIN(len,RESPONCE_STR_MAXLEN-1));
    responce.gamemode[len] = '\0';
    pos += len;
 
    // read mapname
    len = *( unsigned int *)pos;
    pos += 4;
    if( pos + len >= end )
        return 1;
    memcpy(&responce.mapname, pos, len = MIN(len,RESPONCE_STR_MAXLEN-1));
    responce.mapname[len] = '\0';    
 
    // print
 
    system("pause");
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2014, 00:46
Помогаю со студенческими работами здесь

Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in
Здравствуйте! Подскажите как решить проблему с выдаваемыми ошибками: Вот сам файл install.php &lt;?php //Подключение нужных...

query
&lt;?php session_start(); $user = $_SESSION; if ($user) { //user is logged in

Query
Есть 2 разные таблицы( разные datasiurce и query). Нужно чтобы при добавлении данных в первую таблицу, данные добавлялись и во вторую на...

query
создал отчёт с помощью qreport, связал компоненты с запросом. В отчёт не выдаётся информация, если значение в запросе из поля ввода ...

get => $ => query
есть вывод из базы &lt;?php $server=&quot;localhost&quot;; $user=&quot;root&quot;; $password=&quot;&quot;; $baza=&quot;asdg&quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru