2010-07-12 9 views
5

Tengo una PC con dos tarjetas de red conectadas a diferentes redes (configuración de red multi-hogar). Deseo enviar marcos de transmisión UDP en ambas redes. La dirección IP de los remitentes de los marcos debe ser la dirección IP del adaptador, que se utiliza para enviar el marco. La dirección de destino debe ser la dirección LIMITADA DE DIFUSIÓN.Envío de difusión UDP en Windows 7

La aplicación del cliente no debe ejecutarse con derechos administrativos (UAC no es aceptable).

¿Cómo puedo enviar estos marcos UDP a la dirección LIMITADA DE DIFUSIÓN (255.255.255.255)? ¿Cómo podría enviar estos marcos a la dirección de LANZAMIENTO DE RED (x.y.z.255)?

Sé cómo hacer esto con sockets sin procesar. Pero los sockets sin formato solo se pueden usar con derechos administrativos.

Respuesta

3

¿No puede simplemente abrir dos sockets UDP normales y vincular uno a cada una de las direcciones de interfaz y luego simplemente enviarlas a las direcciones de difusión?

Esto, hasta donde yo sé, se ocupará del envío en ambas redes y garantizará que los paquetes enviados tengan la dirección IP correcta. No funcionará si enlaza un solo socket a INADDR_ANY que, por supuesto, FUNCIONARÁ si solo hay un único adaptador de red en la máquina. Para crear una solución completa, probablemente sea mejor iterar sobre las direcciones disponibles y crear un socket para cada una, enlazar a cada una y enviar desde cada una.

+1

No. La vinculación de un socket afecta a qué paquetes recibidos son aceptados por este socket. Los paquetes enviados se enrutan según las reglas de enrutamiento de IP. Puedo repetir los adaptadores y las direcciones IP vinculadas a estos adaptadores y enviar una transmisión de red por cada dirección IP. Pero esto no se envía a la dirección LIMITADA DE DIFUSIÓN. – harper

+0

¿Estás seguro? Cuando emite un SendTo, el socket está vinculado implícitamente al socket local que se utiliza para enviar, de modo que el destinatario pueda responder. Puede ver esto en acción ya que no puede hacer una RecvFrom sin vincular o enviar previamente en el socket ... Si tiene dos interfaces que podrían enrutar al mismo destino, el sistema operativo selecciona una si no se ha enlazado. Puede enlazar antes de emitir un SendTo para seleccionar la dirección local. –

+0

Ah, ya veo. ¡Tienes razón! En Windows 7, la llamada bind() afecta a recibir Y TRANSMITIR marcos. Esta es una diferencia con el comportamiento de Windows XP, donde los marcos se han enviado con cualquier dirección de adaptador arbitraria a todos los adaptadores. Necesita conectores RAW con Windows XP para enviar direcciones de origen apropiadas. Pero Windows 7 envía BROADCASTS LIMITADAS al adaptador al que está destinado el socket. Muchas gracias, Harper – harper