Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
recvfrom ( ) error: 10040 |

20.06.2008, 20:30
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
recvfrom ( ) error: 10040
Здравствуйте народ, я решил написать монитор для серверов Conter Strike
сделал небольшую програмку UDP клиент с использованием сокетов
программа отсылает пакет, но при приеме ответа сообщает об ошибке recvfrom ( ) error: 10040
вот код
PHP код:
#include<stdio.h>
#include<string.h>
#include<winsock2.h>
#include<windows.h>
#define PORT 27015
#define SERVERADDR "10.207.112.107"
int main ( int argc, char* argv [ ] )
{
char buff [ 10*1024 ];
printf (" UDP Client \n");
//Подключение библиотеки
if (WSAStartup ( 0x202, ( WSADATA *) &buff [ 0 ] ))
{
printf (" WSAStartup error: %d\n ", WSAGetLastError ( ) );
return -1;
}
//Создание сокета
SOCKET name_sock=socket ( AF_INET, SOCK_DGRAM, 0 );
if ( name_sock==INVALID_SOCKET )
{
printf (" socket ( ) error: %d \n ", WSAGetLastError ( ) );
WSACleanup ( );
return -1;
}
//Обмен сообщений с сервером
HOSTENT *hst;
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons ( PORT );
//Определение IP-адреса узла
if (inet_addr ( SERVERADDR )) dest_addr.sin_addr.s_addr=inet_addr ( SERVERADDR );
else
if ( hst=gethostbyname ( SERVERADDR )) dest_addr.sin_addr.s_addr=((unsigned long **)
//функция gethostbyname ожидает на входе ТОЛЬКО доменные имена
hst->h_addr_list)[0][0];
else
{
printf ("Unknown host: %d \n", WSAGetLastError ( ));
closesocket ( name_sock );
WSACleanup ( );
return -1;
}
while (1)
{
//Чтение сообщения с клавиатуры
// printf (""); fgets (&buff [0], sizeof (buff) -1, stdin);
// if (!strcmp(&buff [0], "quit \n")) break;
char buff[100] = "яяяяTSource Engine Query";
//передача сообщений на сервер
sendto(name_sock, &buff [0], strlen ( &buff [0] ), 0,(sockaddr *) &dest_addr, sizeof(dest_addr));
//Прием сообщений с сервера
sockaddr_in server_addr;
int server_addr_size=sizeof (server_addr);
int n=recvfrom (name_sock, &buff [0], sizeof(buff)-1,0,(sockaddr *) &server_addr, &server_addr_size);
if ( n==SOCKET_ERROR)
{
printf ("recvfrom ( ) error: %d\n", WSAGetLastError ( ) );
closesocket(name_sock);
WSACleanup ( );
return -1;
}
buff [n]=0;
//Вывод принятого сообщения с сервера на экран
printf("S=>C: %s", &buff [0]);
}
//Выход
closesocket (name_sock);
WSACleanup ( );
return 0;
}
|
|
|

20.06.2008, 20:40
|
|
Познающий
Регистрация: 22.03.2008
Сообщений: 63
Провел на форуме: 247838
Репутация:
65
|
|
Сообщение от fire64
Здравствуйте народ, я решил написать монитор для серверов Conter Strike
сделал небольшую програмку UDP клиент с использованием сокетов
программа отсылает пакет, но при приеме ответа сообщает об ошибке recvfrom ( ) error: 10040
Если размер данных превышает размер буфера для данных, то в UDP лишние данные просто отбрасываются, и устанавливается ошибка WSAEMSGSIZE. ( № 10040 )
Вот ссылка на коды ошибок http://foxpopuli.narod.ru/plb/fsox.html
Последний раз редактировалось _empty; 20.06.2008 в 20:54..
|
|
|

20.06.2008, 20:52
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
это баг профиксил, теперь такая проблема, вместо содержимого пакета, прога много раз выдает ip отправителя
Последний раз редактировалось fire64; 20.06.2008 в 21:21..
|
|
|

20.06.2008, 20:59
|
|
Познающий
Регистрация: 22.03.2008
Сообщений: 63
Провел на форуме: 247838
Репутация:
65
|
|
Сообщение от fire64
это баг профиксил, теперь такая проблема, вместо содержимого пакета, прога много раз выдает ip отправителя
Поверь, одного кода на странице было достаточна
Ну это тебе наверно нужно смотреть спецификацию протокола контры, если она конечно открыта, в чем я конешн сомневаюсь ( корпоративная разработка всеж). Попробуй записывать вывод пакетов в файл, а потом проанализируй нужную тебе информацию, найди смещение X в buff[X] , после которого и будет нужная тебе информация
и что это за строчка такая??
если это конец строки, то он должен выглядеть вот так:
Последний раз редактировалось _empty; 20.06.2008 в 21:06..
|
|
|

20.06.2008, 21:17
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
проблема в том что printf("S=>C: %s", &buff [0]); должна выводить на экран содержимое пакета, а вместо него там ip адрес отправителя
|
|
|

20.06.2008, 21:25
|
|
Познающий
Регистрация: 22.03.2008
Сообщений: 63
Провел на форуме: 247838
Репутация:
65
|
|
Сообщение от fire64
проблема в том что printf("S=>C: %s", &buff [0]); должна выводить на экран содержимое пакета, а вместо него там ip адрес отправителя
Попробуй вместо
PHP код:
printf("S=>C: %s", &buff [0]);
printf("S=>C: %s", buff);
|
|
|

20.06.2008, 21:32
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
Сообщение от _empty
Попробуй вместо
PHP код:
printf("S=>C: %s", &buff [0]);
printf("S=>C: %s", buff);
всеравно вместо содержимого пакета S=>C: ****m10.207.112.107:27015
|
|
|

20.06.2008, 22:49
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
в лабах я давал разборку в шестнадцатиричных кодах блоков приема
|
|
|

26.06.2008, 01:22
|
|
Участник форума
Регистрация: 03.01.2008
Сообщений: 156
Провел на форуме: 414311
Репутация:
110
|
|
вот описание протокола CS:S
http://www.int64.org/docs/gamestat-protocols/source.html
какой свежести не знаю. Изменения дальше гугли сам.
Код ужасен по стилю, некоторые извращения убивают => Бери К&R или Прата и долго медитируй.
Во вторых.
Насколько я понял по описалову сначало нужно запросить сервер пакетом вида - FF FF FF FF 54 != твоей строке символов тк ты передаёшь массив из 100 символов. И при инициализации строкой не указывай размер массива. в итоге чтото типо этого -
char buffer[] = "\xFF\xFF\xFF\xFF\x54";
при передаче передавай на один символ меньше, чтобы исключить \0 - sizeof(buffer) - 1
Пакет первоначального запроса может уже изменился - гугли и спрашивай на тематических форумах.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|