tcp socket send отправка сообщения целиком , deadka, 12-Июл-10, 14:38 [смотреть все]Приветствую!Люди, подскажите кто знает плиз, есть ли возможность у tcp-сокетов (linux, не винда) в случае tcp-соединения отсылать данные "цельно"? В случае датаграмного udp у меня таких проблем и вовсе не было - что recvrom что sendto всегда принимали/отправляли цельно. А можно ли сделать такое в случае tcp-соединения? Как я понял в случае recv можно задать флаг MSG_WAITALL, а вот как быть в случае отправки? Есть ли возможность задания каких-либо флагов/опций сокетов, чтобы как в udp можно было "цельно" отправлять пакеты, размер мне заранее известен. Заранее спасибо!
|
- tcp socket send отправка сообщения целиком , svn, 11:53 , 13-Июл-10 (1)
Нельзя, tcp это поток байт, а не пакетов.PS: Мир не ограничивается tcp и udp. Есть sctp напрмер ))
- tcp socket send отправка сообщения целиком , Xaionaro, 23:52 , 27-Авг-10 (3)
>Нельзя, tcp это поток байт, а не пакетов. > >PS: Мир не ограничивается tcp и udp. Есть sctp напрмер )) Можно работать и на более низком уровне :). Я например вполне удачно всырую формировал ICMP-пакеты. Не думаю, что в TCP это будет сложнее :)
- tcp socket send отправка сообщения целиком , Xaionaro, 23:51 , 27-Авг-10 (2)
Не понял что вы хотите. Но если разбираться в общих чертах, то, AFAIK, OS имеет обычно привычку наоборот "склеивать" пакеты, а не фрагментировать, дабы избежать ненужный служебный трафик. Или вы говорите про frame-ы? К сожелению фреймы ограничиваются mtu и mru, поэтому если данные разбились на несколько фреймов, то с этим лучше не бороться.А вообще, пакеты можно составлять вручную (aka сырые сокеты). Только для этого требуются обычно очень привилегилированный доступ (root). P.S.: в "man 2 send" (в linux) есть флаг "MSG_MORE". Я никогда его не использовал, но на первый взгляд очень похож на то что надо. Советую почитать.
- tcp socket send отправка сообщения целиком , pavlinux, 01:48 , 30-Авг-10 (4)
> чтобы как в 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);
|