2010-10-04 25 views
6

Tengo un servidor con dos conexiones de Ethernet separadas. Cuando enlace un socket en python, se establece de manera predeterminada en una de las dos redes. ¿Cómo puedo extraer una transmisión de multidifusión desde la segunda red en Python? Intenté llamar a bind usando la dirección IP del servidor en la segunda red, pero eso no funcionó.Elegir interfaz de red de multidifusión en Python

Respuesta

0

Me di cuenta. Resultó que la pieza que me faltaba era agregar la interfaz a la estructura mreq que se usa para agregar membresía a un grupo de multidifusión.

1

Cuando bind ing su zócalo, tratan los valores mencionados here:

Para obtener las direcciones IPv4, dos formas especiales se aceptan en lugar de una dirección de host : la cadena vacía representa INADDR_ANY, y la cadena '' representa INADDR_BROADCAST.

INADDR_ANY también se conoce como la dirección de comodín:

sockets con direcciones locales comodín puede recibir mensajes dirigidos al número de puerto especificado y dirigida a cualquiera de las posibles direcciones asignadas a un host`

Más here.

12

Te recomiendo que no uses INADDR_ANY. En entornos de producción de multidifusión, debe ser muy específico con sus sockets de multidifusión y no desea hacer cosas como enviar uniones igmp a todas las interfaces. Esto lleva a soluciones temporales de trabajo pirateado cuando las cosas no funcionan como "route add -host 239.1.1.1 dev eth3" para que las combinaciones de multidifusión funcionen correctamente dependiendo del sistema en cuestión. Use este lugar:

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 

En el mcastsock.bind también se puede utilizar '' en lugar de la cadena de dirección, pero yo aconsejaría contra esto. Con '', si tiene otro socket que usa el mismo puerto, ambos sockets recibirán datos de los demás.

+0

Sí, has salvado mis sueños nocturnos – waza123

Cuestiones relacionadas