2015-10-20 2 views
0

Есть ли способ предотвратить подключение сокета, соединенного с группой многоадресной передачи, от одноадресных данных, направленных на один и тот же порт?Как сохранить многоадресный сокет от получения одноадресных данных

Возможно, вариант сокета или ioctl? Я видел https://msdn.microsoft.com/en-us/library/windows/desktop/ms738712%28v=vs.85%29.aspx, но это, казалось, предназначалось только для фильтрации того, какие хосты могут отправлять вам многоадресные рассылки, а не кто мог отправлять одноадресные номера вообще.

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

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

+0

Вам не нужно использовать гнезда для еркелей, так как Qt использует внутренне на Unix в любом случае. В Windows он использует сокеты Windows. Вы всегда можете получить голый дескриптор из Qt и использовать его для установки параметров сокета. –

+0

Да, извините, если не ясно. Это более то, что я имел в виду, - работая с обычным API сокетов, используя этот дескриптор напрямую. – ultramancool

ответ

1

Это еще хуже: вы даже не можете быть уверены, что получаете только многоадресный трафик, направленный по адресу, к которому вы присоединились. Вы также можете получать многоадресный трафик от групп, к которым подключены другие процессы, которые работают на одном компьютере, хотя они не имеют ничего общего с вашей программой.

Лучшее (потому что большинство переносных) решение - не пытаться решить эту проблему с помощью опций сокета, а проверять полученные пакеты, чтобы узнать, на что они нацелены, и отказаться от тех, которые вы не хотите получать.

Вы можете использовать setsockopt (IP_PKTINFO) и recvmsg(), чтобы разрешить получение всех видов полезной метаинформации на полученных UDP-пакетах, включая обычно очень интересный IP-адрес назначения, который в вашем случае является многоадресным адресом.

+0

Это интересное решение. К сожалению, нет никакой оболочки Qt для этого уже. Однако я мог использовать ip_msfilter, который, по-видимому, существует в Linux и Windows, по крайней мере, для фильтрации многоадресного трафика без ручного сравнения, это также может использовать аппаратные фильтры, поэтому должно быть быстрее, я считаю. – ultramancool

+0

Мне нравится решение IP_PKTINFO, хотя и, вероятно, пойдет таким образом в будущем, я просто взломаю для себя свою собственную оболочку. Спасибо за идею. Оставив это открытым, чтобы увидеть, есть ли более простое решение, но, насколько я нашел до сих пор, это выглядит как лучший вариант. – ultramancool