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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с фрагментацией, на базе HTTP 
V
    Опции темы
insidex
Дата 11.3.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



День добрый, возникла нестандартная (для меня) проблема при написание простого обозревателя сайтов, через HTTP. Использую стандартные функции send/recv и блокирующий сокет. Посылаю на HTTP-сервер запрос на выдачу http-документа.Дальше циклом recv считываю пришедшие данные, тут и начинаются проблемы. Если на участке от сервера до клиента пакеты не подвергались фрагментации,то все нормально - блоки данных приходит на приложение,где и обрабатываются. Но если пакет был фрагментирован, то в приложение приходят блоки той же длины, но в них присутствует "левая" информация,похожая на номер пакета (типа 16af)
Код

<html>
   <body>
   ...document...

    16af

...document...
 

В итоге получаются уже испорченные данные :(

Подскажите, как можно исправить положение ?
Спасибо.
PM MAIL   Вверх
ptr
Дата 11.3.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Показывай код.


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


Новичок



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

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



Код


int LoadURL(void){
    char header[]="GET / HTTP/1.0\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\nUser-Agent: Mozilla/3.0 (compatible)\r\nHost: www.yandex.ru\r\n\r\n";
    SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in addr;
    struct hostent* Host;
    Host = gethostbyname("www.yandex.ru");
    
    memcpy(&addr.sin_addr,Host->h_addr_list[0],Host->h_length);
    addr.sin_port=htons(80);
    addr.sin_family = AF_INET;
    memcpy(addr.sin_zero,"\x00\x00\x00\x00\x00\x00\x00\x00",8);

    connect(sock,(struct sockaddr *)&addr,sizeof(addr));

    if(SOCKET_ERROR == send(sock,header,sizeof(header),0)){
        cout << WSAGetLastError () << "\n";
        exit(1);
    }
    
    int len=1;
    char tbuf[4096];
    while(len != SOCKET_ERROR){
        cout << "GET!\n";
        len = recv(sock,(char *)&tbuf,sizeof(tbuf),0); // проблемная ф-ция !!!
        if(len == 0 || len == SOCKET_ERROR){
            break;
        }else{
            tbuf[len]='\0';
            cout << tbuf ;
        }
    }
    
    closesocket(sock);
    exit(1);
    return 1;
}



Вот собственно обтесанный кусок кода, кстати там еще на recv почему-то иногда приложение просто зависает (намертво) при контакте с некоторыми серверами (например yandex.ru)
PM MAIL   Вверх
insidex
Дата 11.3.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По поводу фрагментации или хз чего-то там... решилось только после отключения под корень Аутпоста  smile 

Осталась еще одна проблема, почему recv глобально зависает на некоторых сайтах  smile

-----------------
Вообщем все мои проблемы были с файрволлом, а не с winsocks, тему можно считать закрытой.

Это сообщение отредактировал(а) insidex - 11.3.2007, 21:36
PM MAIL   Вверх
ptr
Дата 13.3.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(insidex @  12.3.2007,  00:01 Найти цитируемый пост)
Осталась еще одна проблема, почему recv глобально зависает на некоторых сайтах  

Ты выходишь из цикла, когда, либо произошла ошибка, либо сервер разорвал соединение. Сервер просто не разрывает соединение, поэтому программа и зависает на recv.


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


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(insidex @  11.3.2007,  16:44 Найти цитируемый пост)
в них присутствует "левая" информация,похожая на номер пакета (типа 16af)

Цитата(insidex @  11.3.2007,  21:01 Найти цитируемый пост)
По поводу фрагментации или хз чего-то там... решилось только после отключения под корень Аутпоста

это размер страницы. аутпост начинает его показывать при включенной опции EnableGzipEncoding для страниц с включенной компрессией.
PM MAIL   Вверх
insidex
Дата 16.3.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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