ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

recvfrom ( ) error: 10040
  #1  
Старый 20.06.2008, 20:30
Аватар для fire64
fire64
Участник форума
Регистрация: 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 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;

 
Ответить с цитированием

  #2  
Старый 20.06.2008, 20:40
Аватар для _empty
_empty
Познающий
Регистрация: 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..
 
Ответить с цитированием

  #3  
Старый 20.06.2008, 20:52
Аватар для fire64
fire64
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме:
1059196

Репутация: 39
По умолчанию

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

Последний раз редактировалось fire64; 20.06.2008 в 21:21..
 
Ответить с цитированием

  #4  
Старый 20.06.2008, 20:59
Аватар для _empty
_empty
Познающий
Регистрация: 22.03.2008
Сообщений: 63
Провел на форуме:
247838

Репутация: 65
По умолчанию

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

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

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

PHP код:
buff [n]=0
если это конец строки, то он должен выглядеть вот так:

PHP код:
buff [n]='\0'

Последний раз редактировалось _empty; 20.06.2008 в 21:06..
 
Ответить с цитированием

  #5  
Старый 20.06.2008, 21:17
Аватар для fire64
fire64
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме:
1059196

Репутация: 39
По умолчанию

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

  #6  
Старый 20.06.2008, 21:25
Аватар для _empty
_empty
Познающий
Регистрация: 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); 
 
Ответить с цитированием

  #7  
Старый 20.06.2008, 21:32
Аватар для fire64
fire64
Участник форума
Регистрация: 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
 
Ответить с цитированием

  #8  
Старый 20.06.2008, 22:49
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

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

  #9  
Старый 26.06.2008, 01:22
Аватар для izlesa
izlesa
Участник форума
Регистрация: 03.01.2008
Сообщений: 156
Провел на форуме:
414311

Репутация: 110
Отправить сообщение для izlesa с помощью ICQ
По умолчанию

вот описание протокола 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)
 


Быстрый переход




ANTICHAT.XYZ