UDP многоадресная рассылка с использованием различий между Winsock API и XP - PullRequest
5 голосов
/ 06 октября 2009

Похоже, что реализация, необходимая для настройки многоадресного сокета UDP, изменилась между Windows XP и Windows Vista. В частности:

  • В Windows XP вы должны позвонить bind(), прежде чем сможете ссылаться на опции сокета, относящиеся к групповой адресации.

  • Однако в Windows Vista вы не должны вызывать bind() при работе с многоадресными сокетами.

Если ни одна из этих двух точек не приведет к ошибке сокета во время выполнения.

Я схожу с ума, или другие люди тоже видели это? Есть ли лучшее решение, чем условная компиляция вызова bind ()?

Ответы [ 3 ]

5 голосов
/ 06 октября 2009

Какую ошибку вы получаете от setsockopt() вызова, который вы делаете, чтобы применить IP_ADD_MEMBERSHIP и присоединиться к группе многоадресной рассылки?

Я только что провел здесь некоторые тесты с моей серверной платформой, и я отмечаю, что я действительно звоню bind() в Windows 7 (у меня нет коробки с Vista), и я могу затем присоединиться к многоадресной группе как ожидается, если действительны как адрес привязки, так и адрес многоадресной рассылки.

Однако я не могу вызвать bind () с INADDR_ANY, так как это приводит к сбою объединения многоадресной группы с ошибкой 10022 (WSAEINVAL), и если адрес многоадресной группы не является действительным адресом многоадресной рассылки, вызов завершается неудачно с ошибкой 10049 (WSAEADDRNOTAVAIL). Что все кажется достаточно справедливым.

Сейчас я загружаю XP-коробку ...

[Отредактировано после тестирования в XP]

В XP разрешено bind() до INADDR_ANY и разрешено использовать недопустимые адреса многоадресной рассылки. Итак, я ожидаю, что вы делаете один из них, и поэтому он работает на XP, а не на Vista / Win7.

Итак, какую ошибку вы получаете и к какому адресу вы привязываетесь?

1 голос
/ 06 октября 2009

Я не знаю об этом конкретном вопросе, но я знаю, что сетевой стек был переписан с нуля для Vista

0 голосов
/ 02 июля 2015

Ну очень старый вопрос, но кто-нибудь знает, как проверить, какая версия winsock присутствует на машине?

У меня есть несколько старых машин, все еще использующих XP или Server 2003. Но тестирование для версии Windows не помогает, кажется, что возможно иметь версию Windows 5.1, которая не принимает привязку ранее, и машину, имеющую версию 5.2, принимающую ее.

...