Здравствуйте!Написал скачивалку страниц.
На 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Кто-нибудь сталкивался с этим? Как лечить?
Спасибо.
Видимо такая сруктура пакета, начиная со второй посылке, т.к. сокет не может сразу все прочитать, если я правильно понял.Т.е. readbuf должна быть струтурой:
1 байт - длина посланных данных(uint8_t),
все остальное данные(char).
>Видимо такая сруктура пакета, начиная со второй посылке, т.к. сокет не может
>сразу все прочитать, если я правильно понял.
>
>Т.е. readbuf должна быть струтурой:
>
>1 байт - длина посланных данных(uint8_t),
>все остальное данные(char).Да, можно предположить что именно так, но есть одно но:
вот этот вот самый байт "1 байт" он вклинивается в середину того что я прочитал из буфера.
Т.е было бы логично что-то получить из буфера и посленим(или первым следующей посылки) байтом сообщить сколько читать еще, так нет же эта вот ерунда влазит посередине того что я прочитал из буфера..
на скринах видно что этот байт между "------------------", т.е. это то что я прочитал за онду порцию из сокета.
Все оказалось очень посто:
Виною всему вот этот вот заголовок от сервера
Transfer-Encoding: chunkedЧто бы этого не было надо указать
GET http://xxxx HTTP/1.0
вместо
GET http://xxxx HTTP/1.1
Апач сам разбивал документ на порции.