- 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 - Передача файлов, NikR, 01:33 , 01-Июн-06 (9)
- Socket - Передача файлов, chip, 02:15 , 01-Июн-06 (10)
- Socket - Передача файлов, NikR, 02:19 , 02-Июн-06 (11)
- Socket - Передача файлов, chip, 15:25 , 03-Июн-06 (12)
- Socket - Передача файлов, NikR, 01:12 , 04-Июн-06 (13)
- Socket - Передача файлов, NikR, 05:31 , 09-Июн-06 (18)
- Socket - Передача файлов, Serega_S, 07:24 , 09-Июн-06 (19)
>Да, я понял Вашу идею. >Но вопрос остаётся открытым.. >А именно: "Каким образом можно (без отключения алгоритма Нигла) доставить эти дурацкие >данные, которые томятся у клиента" ? > >Надо наверное сворачивать эту тему, а то скорее всего я Вам всем >поднадоел. >Но думается проблема актуальная. Согласен, вопрос остаётся открытым. И было бы хорошо, если бы кто-нибудь на него ответил. Хотя я не уверен, что есть средства вмешательства во внутреннюю логику tcp-протокола. Т.е. фактически дублирование алгоритма Нигла. А гибкий механизм управления типа fflush был бы, конечно, приятен...
- Socket - Передача файлов, cobold, 03:08 , 12-Июн-06 (23)
- Socket - Передача файлов, serge, 15:39 , 11-Июн-06 (21)
- Socket - Передача файлов, vlad, 10:40 , 16-Июн-06 (25)
|