LINUX.ORG.RU

Использование TCP_NODELAY


0

0

Одна программа быстро отсылает маленькие порции данных, чтоб они не склеивались на передачи в один большой пакет используется опция для сокета TCP_NODELAY (наблюдения в tcpdump подтверждают сей факт). Приемная часть эти пакеты принемает, но тут возникает проблема: данные ждем в select'е, и последующий recv получает не один пакет а несколько, тоесть данные склиеваются на приемной стороне. Вопрос как избавится от этого эфекта.


Ну так примерно:

int yes = 1;
setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY,                                           (char *) &yes, sizeof(yes));


Только не везде работает, не на всех платформах/архитектурах

Zmacs
()

Хм... А в таком случае действительно ли нужен протокол TCP? TCP подразумевает поток данных, а маленькие порции - тут уже пакетами попахивает. Если нужна надёжная доставка "пакетированных" данных - советую обратить взор в сторону SCTP (RFC 3286, и далее по тексту. http://www.sctp.org/rfcs.html)

Sectoid ★★★★★
()

> как избавится от этого эфекта

никак не избавиться. TCP не предполагает деления данных на пакеты.

Либо ты должен в передаваемом потоке TCP сам отмечать границы своих сообщений, либо используй UDP и сам позаботься о подтверждении получения данных, сохраении порядка пакетов и т.п.

zwon
()

> Вопрос как избавится от этого эфекта.

Использовать неблокирующие сокеты.

Естественно, данные все равно _могут_ склеиться, и все сказанное тебе про пакеты vs. TCP абсолютно верно.

Очень советую почитать что-нибудь толковое.

anonymous
()
Ответ на: комментарий от anonymous

Кстати, я сделал так: передаю в начале пакета его размер (в первых двух байтах), потом принимаю склеенные и разбираю их на куски. Всё работает замечательно.

Zmacs
()
Ответ на: комментарий от Zmacs

Спасибо за ответы. Вся проблема в том, что нет возможности менять ни протокол ни добавлять какие либо метки для деления данных "в ручную" я думал что существует что то типа TCP_NODELAY, но только для приемной стороны

igor-k
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.