Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с UDP клиентом, вместо пакета IP отправителя 
:(
    Опции темы
fire64
  Дата 20.6.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Здравствуйте народ, я решил написать монитор для серверов Conter Strike
сделал небольшую программку UDP клиент с использованием сокетов.
Проблема состоит в том что строка
Код
printf("S=>C: %s", &buff [0]);

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

Код

#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 cbuff[100] = "ÿÿÿÿTSource Engine Query";




                           //ïåðåäà÷à ñîîáùåíèé íà ñåðâåð
                           sendto(name_sock, &cbuff [0], strlen ( &cbuff [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;
}  

PM MAIL   Вверх
T0ohtik
Дата 9.7.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Значит в пакете содержится адрес отправителя. Ты погляди сколько байт приняла функция.
Код

int  n=recvfrom (name_sock, &buff [0], sizeof(buff)-1,0,(sockaddr  *) &server_addr, &server_addr_size);
std::cout<<n;
 
Кроме того, recfrom поставь цикл, условием выхода из которого будет или n == 0 или n == SOCKET_ERROR 

Это сообщение отредактировал(а) T0ohtik - 9.7.2008, 21:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.