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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обрезается вывод пакета, в консоле обрезаются пакеты 
:(
    Опции темы
fire64
Дата 13.10.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, я написал программу работающую с UDP пакетами, но столкнулся с серьёзной проблемой.
дело в том что пакеты в консоли обрезаются

вывод в консоли обрезается если в пакете встречается 00 в хексе виде

Код

#include<stdio.h>
#include<string.h>
#include<winsock2.h>
#include<windows.h>


#define PORT  27015
#define SERVERADDR  "78.107.233.235"
#define MSG "\xFF\xFF\xFF\xFF\x55\x0E\x5C\x32\x1E"


int main ( int argc, char*  argv [ ] )
{

    
            WSADATA wsaData;
            int  BufLen = 10024;
            char RecvBuf[10024];


              if (WSAStartup(MAKEWORD(2,2), &wsaData))
              {
                                      printf  (" WSAStartup     error:   %d\n ", WSAGetLastError ( ) );
                                      return  -1;
               }


               SOCKET  name_sock=socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
               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 );

               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  **)
                                                                                                                                hst->h_addr_list)[0][0];
              else
                         {
                                       printf ("Unknown host:  %d \n", WSAGetLastError ( ));
                                       closesocket ( name_sock );
                                       WSACleanup ( );
                                       return -1;
                          }


                            int poket= sizeof ( MSG )-1;


                           sendto(name_sock, MSG, poket, 0,(sockaddr  *)  &dest_addr, sizeof(dest_addr));

                           sockaddr_in   server_addr;
                           int server_addr_size=sizeof (server_addr);

                           int  n=recvfrom (name_sock, RecvBuf, sizeof(RecvBuf),0,(sockaddr  *) &server_addr, &server_addr_size);

                           if  ( n==SOCKET_ERROR)
                           {
                                        printf ("recvfrom ( ) error:  %d\n", WSAGetLastError ( ) );
                                        closesocket(name_sock);
                                        WSACleanup ( );
                                        return -1;
                           }

   

strcat(RecvBuf, "\0");

                           
//while(n > 0)
   printf("%s\n", RecvBuf);


                closesocket (name_sock);
                WSACleanup ( );
                 return  0;
}  


PM MAIL   Вверх
ptr
Дата 13.10.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Замени
Код
strcat(RecvBuf, "\0");

на 
Код
RecvBuf[n]='\0';


И кстати '\0' вместо "\0".


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
fire64
Дата 13.10.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



это конечно хорошо, но всёравно выводится только первая строка пакета
PM MAIL   Вверх
ptr
Дата 13.10.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



А ты уверен что у тебя в буфере весь пакет?


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
fire64
Дата 13.10.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 recvfrom (name_sock, RecvBuf, sizeof(RecvBuf),0,(sockaddr  *) &server_addr, &server_addr_size);

а разве функция recvfrom  заносит не весь пакет в буфер ?

объем буфера у меня конечно больше чем размер пакета
PM MAIL   Вверх
ptr
Дата 13.10.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата

recvfrom возвращает уже доступные данные вплоть до запрошенного объема, и не ждет, пока появятся данные полной запрошенной длины

Она вообще ничего про твои пакеты не знает.

Это сообщение отредактировал(а) ptr - 13.10.2008, 15:49


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
fire64
Дата 13.10.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ptr, не подскажешь как получить полный пакет ?
PM MAIL   Вверх
ptr
Дата 13.10.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Размер пакета ты знаешь, количество принятых байт знаешь. Просто собирай пакеты из принятых буферов.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Олег2005
Дата 18.10.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Блокирующий recvfrom () возвращает управление в программу только после того, как в сокет прийдет вся UDP-датаграмма.
Стивенс утверждает, что обрезка истинно происходит только в том случае, если буфер recvfrom меньше пришедшей датаграммы. 
Если выдать recvmsg() на такой датаграмме, то она вернет флаг MSG_TRUNC  в соответствующем поле структуры msghdr - но это на некоторых *nix системах. 

Это сообщение отредактировал(а) Олег2005 - 18.10.2008, 20:41
PM MAIL WWW MSN   Вверх
J0ker
Дата 20.10.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



UDP пакеты не сегментируются и приходят целиком (или не приходят вообще  smile )
также они не объединяются
recvfrom извлекает очередную датаграмму и обрезает ее если она больше буфера - остаток теряется.


--------------------
user posted image
PM MAIL   Вверх
Олег2005
Дата 20.10.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Цитата(J0ker @  20.10.2008,  00:10 Найти цитируемый пост)
UDP пакеты не сегментируются и приходят целиком (или не приходят вообще  smile )

О чем и речь!
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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