Выбор многоадресного сетевого интерфейса в Python - PullRequest
6 голосов
/ 05 октября 2010

У меня есть сервер с двумя отдельными соединениями Ethernet. Когда я связываю сокет в python, по умолчанию используется одна из двух сетей. Как я могу получить многоадресный поток из второй сети в Python? Я пробовал связывать звонки, используя IP-адрес сервера во второй сети, но это не помогло.

Ответы [ 3 ]

12 голосов
/ 24 мая 2011

Я рекомендую вам не использовать INADDR_ANY.В производственных многоадресных средах вы хотите быть очень конкретными со своими многоадресными сокетами и не хотите делать что-то вроде отправки igmp, объединяющего все интерфейсы.Это приводит к обходным решениям для хакерских заданий, когда такие вещи не работают, как «route add -host 239.1.1.1 dev eth3», для правильного выполнения многоадресных объединений в зависимости от рассматриваемой системы.Используйте это вместо:

def joinMcast(mcast_addr,port,if_ip):
    """
    Returns a live multicast socket
    mcast_addr is a dotted string format of the multicast group
    port is an integer of the UDP port you want to receive
    if_ip is a dotted string format of the interface you will use
    """

    #create a UDP socket
    mcastsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    #allow other sockets to bind this port too
    mcastsock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

    #explicitly join the multicast group on the interface specified
    mcastsock.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP,
                socket.inet_aton(mcast_addr)+socket.inet_aton(if_ip))

    #finally bind the socket to start getting data into your socket
    mcastsock.bind((mcast_addr,port))

    return mcastsock

В mcastsock.bind вы также можете использовать '' вместо строки адреса, но я советую против этого.С '', если у вас есть другой сокет, использующий тот же порт, оба сокета будут получать данные друг друга.

1 голос
/ 05 октября 2010

Когда bind в вашем сокете, попробуйте указанные значения здесь :

Для адресов IPv4, две специальные формы принимаются вместо хоста адрес: пустая строка представляет INADDR_ANY и строка '' представляет собой INADDR_BROADCAST.

INADDR_ANY также известен как подстановочный адрес:

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

Подробнее здесь .

0 голосов
/ 06 октября 2010

Я понял это. Оказалось, что часть, которую я пропустил, добавляла интерфейс к структуре mreq, которая используется для добавления членства в многоадресную группу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...