Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Проблемы с фрагментацией


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

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

    16af

...document...
 

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

Подскажите, как можно исправить положение ?
Спасибо.

Автор: ptr 11.3.2007, 18:40
Показывай код.

Автор: insidex 11.3.2007, 19:42
Код


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)

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

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

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

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

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

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

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

это размер страницы. аутпост начинает его показывать при включенной опции EnableGzipEncoding для страниц с включенной компрессией.

Автор: insidex 16.3.2007, 17:01
Спасибо всем!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)