UDP-вещание для обнаружения компьютеров в локальной сети и настройки сервера

Я работаю над прототипом небольшой сетевой игры, в которую можно будет играть в локальных сетях с использованием UDP. Для обнаружения других компьютеров в сети я исследовал широковещательную передачу. Однако я все еще не уверен в некоторых деталях, касающихся настройки / использования сокета UDP (новичок в сети). Я нашел хорошую библиотеку для использования после запуска игры, но сначала необходимо обнаружить все компьютеры, на которых запущена игра, и выбрать один в качестве сервера. Итак, мои вопросы следующие:

  • Можно ли использовать один сокет UDP для прослушивания и отправки широковещательных сообщений? Я почти уверен, что да, но я хотел это проверить.
  • При использовании UDP действительно ли нужно использовать bind()? Насколько я понимаю, connect() не требуется, равно как и send()/recv(), поскольку они предназначены для TCP (sendto()/recvfrom() являются заменами).

person Gemini14    schedule 18.06.2011    source источник
comment
Это хорошо продуманный вопрос, но он содержит несколько вопросов и, вероятно, его лучше было бы задавать как отдельные вопросы.   -  person    schedule 18.06.2011
comment
@ 0A0D Хороший момент, я не был уверен, стоит ли разделить его, потому что они были чем-то связаны. Я оставлю вопросы UDP вместе, а последние два выделю как отдельные вопросы.   -  person Gemini14    schedule 18.06.2011


Ответы (1)


  1. Да, вы можете отправлять широковещательные, одноадресные и получать пакеты (широковещательные или одноадресные) из одного сокета. Это ОЧЕНЬ полезно для работы "ответа отправителю".

  2. Не каждому сокету нужно использовать привязку. Если вы этого не сделаете, порт будет выбран за вас автоматически. Но кто-то должен привязать номер порта до общего доступа, чтобы первый пакет (возможно, широковещательный) был доставлен должным образом. Первый пакет содержит порт источника и IP-адрес; ответные пакеты могут просто использовать это.

  3. Однако привязка обоих концов к фиксированным номерам портов упрощает настройку межсетевого экрана.

  4. setsockopt(SO_BROADCAST), иначе вы получите ошибки при отправке широковещательных пакетов.

person Ben Voigt    schedule 18.06.2011
comment
Очень четкий ответ, особенно немного о привязке - теперь это имеет для меня гораздо больше смысла. Спасибо! - person Gemini14; 18.06.2011