Приветствую!Люди, подскажите кто знает плиз, есть ли возможность у tcp-сокетов (linux, не винда) в случае tcp-соединения отсылать данные "цельно"?
В случае датаграмного udp у меня таких проблем и вовсе не было - что recvrom что sendto всегда принимали/отправляли цельно.
А можно ли сделать такое в случае tcp-соединения? Как я понял в случае recv можно задать флаг MSG_WAITALL, а вот как быть в случае отправки? Есть ли возможность задания каких-либо флагов/опций сокетов, чтобы как в udp можно было "цельно" отправлять пакеты, размер мне заранее известен.
Заранее спасибо!
Нельзя, tcp это поток байт, а не пакетов.PS: Мир не ограничивается tcp и udp. Есть sctp напрмер ))
>Нельзя, tcp это поток байт, а не пакетов.
>
>PS: Мир не ограничивается tcp и udp. Есть sctp напрмер ))Можно работать и на более низком уровне :). Я например вполне удачно всырую формировал ICMP-пакеты. Не думаю, что в TCP это будет сложнее :)
Не понял что вы хотите. Но если разбираться в общих чертах, то, AFAIK, OS имеет обычно привычку наоборот "склеивать" пакеты, а не фрагментировать, дабы избежать ненужный служебный трафик. Или вы говорите про frame-ы? К сожелению фреймы ограничиваются mtu и mru, поэтому если данные разбились на несколько фреймов, то с этим лучше не бороться.А вообще, пакеты можно составлять вручную (aka сырые сокеты). Только для этого требуются обычно очень привилегилированный доступ (root).
P.S.: в "man 2 send" (в linux) есть флаг "MSG_MORE". Я никогда его не использовал, но на первый взгляд очень похож на то что надо. Советую почитать.
> чтобы как в 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);