URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8801
[ Назад ]

Исходное сообщение
" tcp socket send отправка сообщения целиком "

Отправлено deadka , 12-Июл-10 14:38 
Приветствую!

Люди, подскажите кто знает плиз, есть ли возможность у tcp-сокетов (linux, не винда) в случае tcp-соединения отсылать данные "цельно"?

В случае датаграмного udp у меня таких проблем и вовсе не было - что recvrom что sendto всегда принимали/отправляли цельно.

А можно ли сделать такое в случае tcp-соединения? Как я понял в случае recv можно задать флаг MSG_WAITALL, а вот как быть в случае отправки? Есть ли возможность задания каких-либо флагов/опций сокетов, чтобы как в udp можно было "цельно" отправлять пакеты, размер мне заранее известен.

Заранее спасибо!


Содержание

Сообщения в этом обсуждении
" tcp socket send отправка сообщения целиком "
Отправлено svn , 13-Июл-10 11:53 
Нельзя, tcp это поток байт, а не пакетов.

PS: Мир не ограничивается tcp и udp. Есть sctp напрмер ))


" tcp socket send отправка сообщения целиком "
Отправлено Xaionaro , 27-Авг-10 23:52 
>Нельзя, tcp это поток байт, а не пакетов.
>
>PS: Мир не ограничивается tcp и udp. Есть sctp напрмер ))

Можно работать и на более низком уровне :). Я например вполне удачно всырую формировал ICMP-пакеты. Не думаю, что в TCP это будет сложнее :)


" tcp socket send отправка сообщения целиком "
Отправлено Xaionaro , 27-Авг-10 23:51 
Не понял что вы хотите. Но если разбираться в общих чертах, то, AFAIK, OS имеет обычно привычку наоборот "склеивать" пакеты, а не фрагментировать, дабы избежать ненужный служебный трафик. Или вы говорите про frame-ы? К сожелению фреймы ограничиваются mtu и mru, поэтому если данные разбились на несколько фреймов, то с этим лучше не бороться.

А вообще, пакеты можно составлять вручную (aka сырые сокеты). Только для этого требуются обычно очень привилегилированный доступ (root).

P.S.: в "man 2 send" (в linux) есть флаг "MSG_MORE". Я никогда его не использовал, но на первый взгляд очень похож на то что надо. Советую почитать.


" tcp socket send отправка сообщения целиком "
Отправлено pavlinux , 30-Авг-10 01:48 
> чтобы как в udp можно было "цельно" отправлять пакеты, размер мне заранее известен.

int res;
int buffsz = SIZE_OF_PKT;

setsockopt(s, SOL_SOCKET, SO_SNDBUF, &buffsz, sizeof(buffsz));
write(s, buff, SIZE_OF_PKT);

.........

setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffsz, sizeof(buffsz));
read(s, buff, SIZE_OF_PKT);