Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2011, 15:13   #1
Slafka
 
Регистрация: 06.06.2011
Сообщений: 6
По умолчанию Сокеты windows

Добрый день.
Изучал сокеты в windows (библиотека Ws_32.lib), написал небольшой класс для работы с функциями и пытался по протоколу http загрузить страницу с произвольного сайта.
Столкнулся с проблемкой в работе функции recv():
Код:
int ret = recv(Sock::_Socket, buf, MSGSIZE, 0);
В строку buf, куда должны копироваться данные с сокета, периодически попадают левые числа и буквы.
К примеру:
Код:
<h4 class="forumlink"><a href="./viewforum.php?f=921">Мультсериа
 
2000
 
лы</a></h4>
Как правило, в начале страницы вставляется "2000", "1000" а под конец может появится и вовсе произвольный набор букв и цифр, например:
Код:
<h4 class="forumlink"><a href="./viewforum.php?

67de

f=828">Материалы для мультимедиа и дизайна</a></h4>
Происходит это с солидной периодичностью - раз в 300 строк HTML текста.
Кто-нибудь сталкивался с подобной проблемой, или есть какие-нибудь идеи?
Slafka вне форума Ответить с цитированием
Старый 21.06.2011, 20:00   #2
Мастак
Пользователь
 
Регистрация: 24.02.2010
Сообщений: 19
По умолчанию

Попробуй перед каждым вызовом recv заполнять буфер нулями (чистить).
Мастак вне форума Ответить с цитированием
Старый 22.06.2011, 00:16   #3
fenryr
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 28
По умолчанию

это происходит от того, что контент передается частями (chunk)
читать их нужно до тех пор, пока не попадется фрагмент размером 0
читай сначала заголовки
Код:
// чтение строки из сооединения
// char* buffer - буфер для сохранения считанной строки
// возрат 0  успех ; -1 ошибка
int Readline (SOCKET  sock , char* buffer) {
   char temp[2];
   int nread;
   int nlen = 0;
   
   nread = recv (sock, temp , 1 , 0); // принимаем 1 байт
   // читаем пока не ошибка и не конце строки
   while (nread != SOCKET_ERROR && temp[0] != '\n') { 
   buffer[nlen++] = temp[0]; // пишем в буфер
   nread = recv (sock, temp , 1 , 0);
   }
   buffer[nlen] = 0; // признак окончания строки   
   if (nread == SOCKET_ERROR ) return -1; // если была ошибка
   return 0;
}



// читает заголовки ответа 
// int* cLen - для сохранения длины документа
// int* rCode - для сохраненяи кода ответа
// возрат 0  успех ; -1 ошибка

int ReadHeaders (SOCKET sock , int* rCode) {
     char buffer[512];
     int nret;    
     
     nret = Readline (sock , buffer);
     if (nret == -1) return -1;
            
     while (buffer[0] != '\r') // читаем до пустой строки
     {
       printf ("%s\n", buffer);   
       // если строка начинается с HTTP/
       if (strncmp("HTTP/", buffer , 5) == 0) {
           sscanf (&buffer[9], "%d", rCode) ; // считываем число начиная с 9й позиции   строки
       }
       }
       
       nret = Readline (sock , buffer); // считываем следующую строку
       if (nret == -1) return -1;
     }    
   // printf ("\n\nResponse Code: %d\n", *rCode);
     return 0;         
}
потом вызываешь Readline и получаешь строку - размер 1го фрагмента.
переводишь его в число - например sscanf (buffer , "%x", size);
выделяешь буфером размером size - читаешь в него байты
затем следующий chunk, до 0го
потом принятые буферы склеиваешь
fenryr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сокеты Windows Slafka Visual C++ 0 06.06.2011 15:00
С#, сокеты Namolem Общие вопросы .NET 0 06.05.2010 10:53
Windows Sockets / Сокеты / RAW Sockets bwwebm Работа с сетью в Delphi 4 23.04.2010 09:53
Сокеты Pavelok Работа с сетью в Delphi 3 16.09.2009 16:57
Сокеты IICuX123 Общие вопросы .NET 6 27.07.2009 01:27