LINUX.ORG.RU

Отправка UDP пакета


0

0

Заранее прошу не пинать ногами, вопрос скорее всего "глупый". Посмотрел исходники функций для отсылки/получения UDP пакетов и возник вопрос, там везде в качетсве параметра указан сокет, то есть если я хочу кому то отправить UDP пакет то перед этим необходимо установить сокетное соединение?


ну да типа так:

s = socket(PF_INET, SOCK_DGRAM, 0); connect(s, (struct sockaddr *) &udp_addr, sizeof(udp_addr));

вот вроде и всё.

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

а разве это не TCP так работает? У меня бывает, что UDP покеты накапливаются и потом доходить начинают, если прога зависает. Я вообще думал, что UDP как раз не устанавливает соединения.

vilfred ☆☆
()

сокет - это не соединение, это вобчем 'transport end point'.. просто системный интерфейс сетевых протоколов. Почитайте info libc/sockets - толково и сжато описанно всё.

'сокетное соединение' - смешной получился термин :-)

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

да по-разному можно...socket() нужно всегда делать, а connect() уже зависит от задачи...просто если connect'ом подрубаешься к серверу можно потом обычные read/write использовать вместо recvfrom/sendto...вобщем надо Стивенса почитать у него это всё подробно рассмотрено.

no1sm ★★
()

UDP - дейтаграмный протокол, не гаранитрующий доставку пакета. Он работает без установки соединения. Просто кидает пакеты с заданным маком и IP в сеть, дальнейшая их судьба его не волнует

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

> s = socket(PF_INET, SOCK_DGRAM, 0); connect(s, (struct sockaddr *) &udp_addr, sizeof(udp_addr));

В биореактор!!! Немедленно!!!

При работе с UDP-шным сокетом сначала создается сокет (вызов сокет написан правильно), затем делается bind на локальный адрес, а connect к UDP-шным сокетам неприменим, и вернет код ошибки! И только после этого можно отправлять данные, использую sendto и принимать через recvfrom.

Пример, чтобы было понятно:

struct sockaddr_in local; struct sockaddr_in remote;

s = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );

local.sin_family = AF_INET; inet_aton( "192.168.0.1", &local.sin_addr ); local.sin_port = htons( 1025 );

bind( s, (struct sockaddr*) & local, sizeof(local) );

remote.sin_family = AF_INET; inet_aton( "192.168.0.100", &remote.sin_addr ); remote.sin_port = htons( 139 );

sendto ( s, "В биореактор!", strlen("В биореактор!"), 0, &remote, sizeof(remote) );

no-dashi ★★★★★
()
Ответ на: комментарий от vt100

> > а connect к UDP-шным сокетам неприменим, и вернет код ошибки!

> С чего это?! Никогда не слышали про connected UDP?

В man'ах, конечно, сказано что "если ... является единственным адресом получателя..." и далее по тексту, но в этом случае куда резонней использовать TCP - все равно программе придется организовывать обмен "квитанциями" о получении пакетов, так что не так уж и страшен TCP-шнй оверхед, как его малюют.

UDP же обычно выбирают если нужно организовать "широковещательное общение" типа каждый-с-каждым, типа виндовой сети, и поэтому... Поэтому, "Мне кажется, connect здесь не уместен" - почти как в незабвенных 12-ти стульях.

no-dashi ★★★★★
()
Ответ на: комментарий от no1sm

> и сразу в биорактор!

Дык?! Выбирать UDP для работы только с одним хостом, нагружаю свою программу реализацией сеанса - в биореактор :-) Использовать connect на UDP при работе со множеством хостов - все равно в биореактор! :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Слушай, я udp выбрал один раз, когда у tcp не хватало скорости(нужно было 8mb/s, blackfin.uclinux.com), и привёл кусок своего кода... в чём проблема? кому нужен udp, то прочитает, что нижно, аллах акбар!! a kak же новые робаты? должны ли они служить нам? свою сили покажи!!

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

> Слушай, я udp выбрал один раз, когда у tcp не хватало скорости (нужно было 8mb/s, blackfin.uclinux.com)

Да пожалуйста... Вот только расскажи всем - как ты решал проблему с гарантированием доставки данных? :-)

P.S.: time dd if=/dev/zero bs=4096 count=25600 | nc testhost 1025 [прочесть 100 мегабайт из /dev/zero и сунуть их по tcp на хост testhost, порт 1025] отрабатывает за 9 секунд. А 100 мегабайт за 9 секунд - это в среднем 11 мегабайт в секунду :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

> Да пожалуйста... Вот только расскажи всем - как ты решал проблему с гарантированием доставки данных? :-)

починил tcp.

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