URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7400
[ Назад ]

Исходное сообщение
"Прблема при чтении из буфера TCP"

Отправлено BsDr , 04-Июн-08 11:48 
Здравствуйте!

Написал скачивалку страниц.
На kevent, при готовности сокета на чтение делаю не блокируемый сокет и пытаюсь скачать страницу, если вкраце то так:

setsockopt(kq_events[i].ident, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

for(;;)
    {
        if((n = read(kq_events[i].ident, readbuf, MAXLINE)) == 0)
            {
                close(kq_events[i].ident);
                break;
            }
        
        if(n < 0)
            {
                close(kq_events[i].ident);
                if(errno == EWOULDBLOCK)
                    {
                        printf("TIMEOUT RCV!!!\n");
                    }
                break;
            }
        
        printf("n: %i\n", n);
        printf("readbuf: %s\n", readbuf);
        printf("-----------------------------------------------------------\n");
        
        bzero(&readbuf, MAXLINE*sizeof(char));
    }

так вот причтении получается слудующее:

в то содержимое что а прочитал вклиниваются какието левые символы,
символы эти являются размером(в 16ти ричном формате) в байтах той части текста, которая идет после этих цифр до конца прочитанного(ну или то следуючего такого вклинивания).
Ниже скрины и привер текста, тот что скачал:

http://funnylinks.ru/opennet/scr1.JPG
http://funnylinks.ru/opennet/scr2.JPG
http://funnylinks.ru/opennet/siteHTML.txt

Кто-нибудь сталкивался с этим? Как лечить?
Спасибо.


Содержание

Сообщения в этом обсуждении
"Прблема при чтении из буфера TCP"
Отправлено Fisher , 04-Июн-08 13:43 
Видимо такая сруктура пакета, начиная со второй посылке, т.к. сокет не может сразу все прочитать, если я правильно понял.

Т.е. readbuf должна быть струтурой:

1 байт - длина посланных данных(uint8_t),
все остальное данные(char).


"Прблема при чтении из буфера TCP"
Отправлено BsDr , 04-Июн-08 14:53 
>Видимо такая сруктура пакета, начиная со второй посылке, т.к. сокет не может
>сразу все прочитать, если я правильно понял.
>
>Т.е. readbuf должна быть струтурой:
>
>1 байт - длина посланных данных(uint8_t),
>все остальное данные(char).

Да, можно предположить что именно так, но есть одно но:
вот этот вот самый байт "1 байт" он вклинивается в середину того что я прочитал из буфера.
Т.е было бы логично что-то получить из буфера и посленим(или первым следующей посылки) байтом сообщить сколько читать еще, так нет же эта вот ерунда влазит посередине того что я прочитал из буфера..
на скринах видно что этот байт между "------------------", т.е. это то что я прочитал за онду порцию из сокета.


"Прблема при чтении из буфера TCP"
Отправлено BsDr , 04-Июн-08 16:37 
Все оказалось очень посто:
Виною всему вот этот вот заголовок от сервера
Transfer-Encoding: chunked

Что бы этого не было надо указать
GET http://xxxx HTTP/1.0
вместо
GET http://xxxx HTTP/1.1
Апач сам разбивал документ на порции.