Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   recvfrom ( ) error: 10040 (https://forum.antichat.xyz/showthread.php?t=74417)

fire64 20.06.2008 20:30

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 argcchar*  argv [ ] )
{
              
char buff 10*1024 ];
              
printf  (" UDP Client \n");
        
//Подключение библиотеки
              
if (WSAStartup 0x202, ( WSADATA  *) &buff ] ))
              {
                                      
printf  (" WSAStartup     error:   %d\n "WSAGetLastError ( ) );
                                      return  -
1;
               }
             
//Создание сокета
               
SOCKET  name_sock=socket AF_INETSOCK_DGRAM);
               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_addrsizeof(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;



_empty 20.06.2008 20:40

Цитата:

Сообщение от fire64
Здравствуйте народ, я решил написать монитор для серверов Conter Strike
сделал небольшую програмку UDP клиент с использованием сокетов

программа отсылает пакет, но при приеме ответа сообщает об ошибке recvfrom ( ) error: 10040

Если размер данных превышает размер буфера для данных, то в UDP лишние данные просто отбрасываются, и устанавливается ошибка WSAEMSGSIZE. ( № 10040 ) :)

Вот ссылка на коды ошибок http://foxpopuli.narod.ru/plb/fsox.html

fire64 20.06.2008 20:52

это баг профиксил, теперь такая проблема, вместо содержимого пакета, прога много раз выдает ip отправителя

_empty 20.06.2008 20:59

Цитата:

Сообщение от fire64
это баг профиксил, теперь такая проблема, вместо содержимого пакета, прога много раз выдает ip отправителя

Поверь, одного кода на странице было достаточна :)

Ну это тебе наверно нужно смотреть спецификацию протокола контры, если она конечно открыта, в чем я конешн сомневаюсь ( корпоративная разработка всеж). Попробуй записывать вывод пакетов в файл, а потом проанализируй нужную тебе информацию, найди смещение X в buff[X] , после которого и будет нужная тебе информация :)

и что это за строчка такая??

PHP код:

buff [n]=0

если это конец строки, то он должен выглядеть вот так:

PHP код:

buff [n]='\0'


fire64 20.06.2008 21:17

проблема в том что printf("S=>C: %s", &buff [0]); должна выводить на экран содержимое пакета, а вместо него там ip адрес отправителя

_empty 20.06.2008 21:25

Цитата:

Сообщение от fire64
проблема в том что printf("S=>C: %s", &buff [0]); должна выводить на экран содержимое пакета, а вместо него там ip адрес отправителя

Попробуй вместо
PHP код:

printf("S=>C: %s", &buff [0]);

printf("S=>C: %s"buff); 


fire64 20.06.2008 21:32

Цитата:

Сообщение от _empty
Попробуй вместо
PHP код:

printf("S=>C: %s", &buff [0]);

printf("S=>C: %s"buff); 


всеравно вместо содержимого пакета S=>C: ****m10.207.112.107:27015

Delimiter 20.06.2008 22:49

в лабах я давал разборку в шестнадцатиричных кодах блоков приема

izlesa 26.06.2008 01:22

вот описание протокола 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
Пакет первоначального запроса может уже изменился - гугли и спрашивай на тематических форумах.


Время: 09:26