2009-11-20 3 views
0

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

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

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

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

Кроме того, для вашей информации варианты этого кода будут записаны в Python и C#. Я могу найти конкретные API, как и для модели сокетов BSD.

+0

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

ответ

2

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

+0

Это правильно. Вам не нужно связывать() '- случайный порт, который предоставил вам ОС, будет прекрасным (и нет, вам не нужно ничего делать, чтобы этот сокет UDP прослушивал входящие пакеты). «connect» - это хорошая идея. – caf

0

bind гнездо для получения желаемого порта.

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

+0

Ну, вы всегда можете привязываться к другому порту. Важно то, что вы следите за тем, какой порт вы фактически привязываете. – futureelite7

+0

@ futurelite7: да, мое замечание, если использовал определенный порт. как всегда то же самое. – RageZ

1

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

0

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

Смежные вопросы