The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Socket - Передача файлов, !*! NikR, 27-Май-06, 04:05  [смотреть все]
  • Socket - Передача файлов, !*! ACCA, 11:39 , 27-Май-06 (1)
  • Socket - Передача файлов, !*! smb, 01:39 , 28-Май-06 (2)
    • Socket - Передача файлов, !*! NikR, 02:00 , 29-Май-06 (3)
      • Socket - Передача файлов, !*! niknik, 13:48 , 29-Май-06 (4)
      • Socket - Передача файлов, !*! Serega_S, 03:11 , 05-Июн-06 (14)
        >Передаётся небольшая структура. При аналезе (tcpdump..) выяснелось, что пару фрагментов
        >остаются на клинтской части. Обидно. Приходиться закрывать соединение, а затем вновь подключаться,
        >тогда те куски приходят без проблем.
        >Идея понятна. Но как реализовать?

        Если есть необходимость передавать данные без задержек по tcp протоколу, то необходимо отключить алгоритм Нигла в сокете. Этот алгоритм предотвращает большое количество мелких пакетов в сети, которые излишне нагружают сеть и уменьшают её пропускную способность. Этот алгоритм предотвращает посылку мелких пакетов путём ожидания добавление ещё данных в буфер, т.е. данные отсылаются одним большим куском, или же по истечении некоторого времени, которое может быть довольно большим.

        Чтобы отклюсить этот алгоритм, необходимо после создания сокета функцией socket():

        setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char*)&t,sizeof(t));

        • Socket - Передача файлов, !*! NikR, 10:23 , 05-Июн-06 (15)
        • Socket - Передача файлов, !*! NikR, 10:27 , 05-Июн-06 (16)
          • Socket - Передача файлов, !*! Serega_S, 03:29 , 07-Июн-06 (17)
            >Это конечно всё хорошо. Но я сомневаюсь, что с подобной проблемой, боряться
            >таким образом.
            >Как говориться это уже в крайнем случае. Да и идея у меня
            >не в том что бы без задержек передовать данные, а чтоб
            >последний фрагмент доставить.

            1) Если вы больше не будете передавать данные по сокету - закрываейте его - данные передадуться оставшиеся в буфере передачи.
            2) Если ожидается ещё передавать данные по этому сокету - ждите ещё блока данных - он вытолкнет буфер - т.е. логика работы не нарушается.
            3) Если важно именно "сразу" получить данные, т.к. следующий может прийти через 3 дня к примеру, то это как раз проблема временная, которая решается отключением алгоритма Нигла.
            4) Если есть проблема в "зависании" приёмной стороны - делайте или неблокируемый сокет или же многопоточное приложение.

            P.S. Какого либо решения наподобии fflush() для сокета я не знаю, если оно есть - будет интересно услышать.

  • Socket - Передача файлов, !*! NuINu, 16:53 , 30-Май-06 (7)
  • Socket - Передача файлов, !*! serge, 15:39 , 11-Июн-06 (21)
  • Socket - Передача файлов, !*! vlad, 10:40 , 16-Июн-06 (25)



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

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