The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Прблема при чтении из буфера 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, 13:43 , 04-Июн-08 (1)
    Видимо такая сруктура пакета, начиная со второй посылке, т.к. сокет не может сразу все прочитать, если я правильно понял.

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

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

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

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру