Общие вопросы по программированию сокетов UDP

У меня есть устройство FPGA, с которым мой код должен общаться. Протокол выглядит следующим образом:

Я отправляю один ненулевой байт (UDP), чтобы включить функцию. Затем плата FPGA начинает выдавать данные на порт, с которого я отправил.

Вы видите мою дилемму? Я знаю, на какой порт я отправил сообщение на, но я не знаю, с какого порта я отправил (это этот порт обычно не выбирается ОС автоматически?).

Мое лучшее предположение о том, что я должен сделать, это создать сокет с IP-адресом назначения и номером порта, а затем повторно использовать сокет для получения. Если я это сделаю, будет ли он уже настроен на прослушивание порта, с которого я отправил исходное сообщение?

Также, к вашему сведению, варианты этого кода будут написаны на Python и C#. Я могу найти конкретные API, поскольку оба следуют модели сокетов BSD.


person Nate    schedule 20.11.2009    source источник
comment
Я нашел полезную информацию в книге, которая прояснила для меня этот вопрос. Если я снова найду абзац, я добавлю его в качестве комментария. По сути, это подтвердило мои подозрения. 1) Вы не можете указать порт из, который вы хотите отправить. 2) Нет необходимости выполнять привязку при использовании UDP. После использования sendto() сокет можно повторно использовать для получения данных на порт от, с которого был отправлен первый запрос. Мне кажется странным, что это поведение не стало очевидным из многочисленных документов, которые я прочитал. Я посмотрю, смогу ли я отследить эту ссылку.   -  person Nate    schedule 11.01.2010


Ответы (4)


Именно для этого и нужны connect(2) и getsockname(2). В качестве бонуса за подключение сокета UDP вам не нужно будет указывать адрес/порт назначения при каждой отправке, вы сможете обнаружить недоступный порт назначения (ответ ICMP от цели будет отображаться как ошибка при следующей отправке, а не удалено), и вашей ОС не придется неявно подключать и отключать сокет UDP при каждой отправке, экономя несколько циклов.

person Nikolai Fetissov    schedule 20.11.2009
comment
Это правильно. Вам не нужно bind() - случайный порт, который дала вам ОС, будет в порядке (и нет, вам не нужно делать ничего особенного, чтобы этот сокет UDP прослушивал входящие пакеты). connectно это хорошая идея. - person caf; 24.11.2009

Вы можете bind подключить сокет к определенному порту, проверьте man bind

person Elalfer    schedule 20.11.2009

вы можете связать сокет, чтобы получить нужный порт.

Единственная проблема с этим заключается в том, что вы не сможете запускать более одного экземпляра вашей программы за раз на компьютере.

person RageZ    schedule 20.11.2009
comment
Ну, вы всегда можете привязаться к другому порту. Важно то, что вы отслеживаете, к какому порту вы на самом деле привязаны. - person futureelite7; 20.11.2009
comment
@futurelite7: да, мое замечание, если бы использовался определенный порт. вроде всегда одно и то же. - person RageZ; 20.11.2009

Вы используете UDP для отправки/получения данных. Просто создайте новый сокет UDP и привяжите его к желаемому интерфейсу/порту. Затем дайте указание вашей программе FPGA отправлять пакеты UDP обратно на порт, к которому вы привязаны. UDP не требует прослушивания/установки соединений. (требуется только с TCP)

person futureelite7    schedule 20.11.2009