HTTP 1.1,вопрос

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 5 Mar 2010.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    1.1 в отличии от 1.0 незакрывает сокет после ответа на запрос.Так как тогда в 1.1 отловить момент когда нужно прекращать прием данных?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 _nic ну там много различий. Тут всё делов в двух вещах:
    поле Connect каторое ты передаешь. Там ты можешь сказать Keep-alive или close
    Первое типа остаться на линии, а второе - типа чтобы сервак закрыл соединение после отправки данных.
    Вторая фишка - сервак отвечает и в его ответе почти всегда есть Content-Length в котором написано сколько данных он должен передать тебе. Вот и считывай это кол-во )
     
  3. dvion

    dvion New Member

    Joined:
    11 Mar 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Если в отдельных случаях с блоками осиливать вручную лень - лучше юзать 1.0. В реальных условиях keep-alive редко, когда может пригодиться.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    keep-alive юзается когда в один контекст посылаются несколько последовательных запросов. Такое любят делать с проксями браузеры типа FF.
     
  5. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    slesh, что тогда означает поле Keep-Alive: 300, и почему в большинстве случаев именно 300, а не какое-нибудь другое значение?
     
  6. wildshaman

    wildshaman Elder - Старейшина

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Keep-Alive. Заголовок Keep-Alive содержит значение, которое означает в течение какого времени в секундах будет удерживаться соединение. Этот заголовок следует отправлять только в том случае, если заголовок Connection содержит значение keep-alive.
    Поддерживается только для протокола HTTP версии 1.1.

    В нашем примере этот заголовок содержит значение 300, т.е. браузер сообщает серверу, что намерен удерживать постоянное соединение с сервером в течение 300 секунд.
     
    1 person likes this.
  7. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    wildshaman, спасибо большое, теперь понятно.
     
  8. dvion

    dvion New Member

    Joined:
    11 Mar 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    slesh,
    Броузеры - да, смысл - в редких случаях актуален.
     
  9. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Слушайте, меня интересует следующие:

    1) Как реализовать работу программы, если используешь Keep-Alive, но при этом сервак не передал значение Content-Length (количество отправленных байтов)?
    2) Если принял все данные, как реализовать паузу (те же 300 сек.), оставаясь на линии, но при том, что бы программа не зависала от ожидания?
     
  10. dvion

    dvion New Member

    Joined:
    11 Mar 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    1)
    а) 0D 0A (в отсутствии content-length)
    б) читать блоки, пока блок не станет меньше его размера (в отсутствии content-length)

    2)

    - Буфер
    - Три процедуры (открытие-коннект, работа с буфером, закрытие)
    - Thread
     
  11. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    dvion, что ты имеешь здесь ввиду:
    Ну и:
    Не исключено, что все блоки будут одинакового размера. Или же наоборот: сервер будет отправлять блоки разного размера. (по 1024 байт, 2048 и т. д.)
     
  12. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    Keep-Alive - это поле указывает на не разрываное соединение, напиример "Connection: kerep-alive". и период соединения: "Keep-alvive: 300" а ваще найдите статью на википедии про HTTP - заголовки ))) там есть все))) особенно про Referer и User-Agent)
     
    #12 RedFern.89, 6 Mar 2010
    Last edited: 6 Mar 2010
  13. dvion

    dvion New Member

    Joined:
    11 Mar 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Chrome~,
    0D 0A - идентификационная последовательность байт, который сведетельствует об окончании передачи. Только не нужно забывать про тайм-аут, а то до конца дней будешь эту связку байт ждать :-D

    Ну дык, надо организовать буфер, иначе отдельный поток на работу, через winsock, например. Он будет штундировать, пока не нарвётся на тайм-аут, например. Или не получит 0D 0A, или не упрётся носом в content-length. В потоке организовываешь саму работу с сокетом, а в классе реализации сокета уже всякими штуками промышляешь.

    Может скинуть самую успешную, на мой взгляд, реализацию этих дел?

    Собсно - вот: http://www.ararat.cz/synapse/

    Лучше - не видал! И посмотреть в сорцах можно всё, что требуется)
     
    #13 dvion, 7 Mar 2010
    Last edited: 7 Mar 2010
  14. rikko

    rikko Member

    Joined:
    23 Nov 2009
    Messages:
    16
    Likes Received:
    7
    Reputations:
    0
    dvion, ну просто кладезь ценной инфы! очень хорошо. спасибо, за ссыль.
     
  15. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Гм а что есть сервера которые игнорируют "Connection : Close" ?