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

SA-MP Query на Си

05.04.2014, 22:06. Показов 3811. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru