Lanzamiento de escucha de socket de multidifusión

1

No estoy seguro de si me he perdido algo de documentación o no, pero me está costando descubrir cómo configurar un launchdagente que se pueda activar cada vez que se reciba un datagrama dentro de un grupo de multidifusión.

Lo que me gustaría saber es cómo launchddebería ser un plist para proporcionar un oyente de datagramas simple que esté vinculado a un grupo de multidifusión.

Esto es lo que he estado intentando:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>foo.bar</string>
    <key>Program</key>
    <string>/foo/bar</string>
    <key>Sockets</key>
    <dict>
        <key>Listeners</key>
        <dict>
            <key>SockType</key>
            <string>dgram</string>
            <key>SockServiceName</key>
            <string>12345</string>
            <key>SockFamily</key>
            <string>IPv4</string>
            <key>MulticastSocket</key>
            <string>224.0.0.253</string>
        </dict>
    </dict>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <false/>
    </dict>
</dict>
</plist>

Pero solo genera getaddrinfoerrores ("nombre de nombre o nombre de servidor proporcionados, o no conocidos"). Parece que eliminar el grupo de multidifusión para configurar un puerto UDP funciona bien, pero realmente no quiero tener que codificar una dirección IP o DNS local.

¿Hay algún buen ejemplo de cómo crear un agente de lanzamiento de escucha de multidifusión o un demonio usando launchd? ¿O me estoy perdiendo algún otro paso o no entiendo qué datos debo ingresar para un grupo de multidifusión?

Haravikk
fuente
¿Qué es un agente de lanzamiento de escucha de multidifusión? ¿Y un oyente de datagramas? Aunque he creado numerosos agentes de lanzamiento, nunca he visto estos términos / jerga.
CousinCocaine
1
Puede crear agentes de lanzamiento con una lista de sockets, si reciben un mensaje en uno de estos, el programa se inicia con el mensaje en la entrada estándar. La multidifusión es UDP (datagramas) donde simplemente se envía un mensaje a todas las máquinas de la red sin necesidad de conectarse primero a ellas, y cualquiera que elija puede responder.
Haravikk
1
¿Cómo puedo probar un demonio de lanzamiento de escucha de multidifusión lanzado en funcionamiento? ¿Cómo puedo invocar tal datagrama?
klanomath
1
Puede probar el envío de un mensaje UDP haciendo algo como echo 'My message' | nc -uw 1 localhost 6000enviar el mensaje a un servicio que escucha el puerto 6000 en su máquina local. No estoy seguro de si es nccompatible con el envío de mensajes de multidifusión (no veo una opción), pero le permite probar al enviar directamente a una sola máquina.
Haravikk

Respuestas:

1

Configuré este usando LaunchControl .

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>foo/bar</string>
    <key>Program</key>
    <string>/foo/bar</string>
    <key>Sockets</key>
    <dict>
        <key>Sock1</key>
        <dict>
            <key>MulticastGroup</key>
            <string>224.0.0.253</string>
            <key>SockFamily</key>
            <string>IPv4</string>
            <key>SockProtocol</key>
            <string>UDP</string>
            <key>SockServiceName</key>
            <string>12345</string>
            <key>SockType</key>
            <string>dgram</string>
        </dict>
    </dict>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <true/>
    </dict>
</dict>
</plist>
tron_jones
fuente
¡Gracias por la respuesta! ¿Pudiste verificar esto de alguna manera? He probado el mismo archivo básico, simplemente utilizándolo catcomo programa y redirigiendo stdouty stderr(utilizando las teclas de plist apropiadas) pero no produce ningún resultado. En cambio, recibo un montón de errores de "no existe tal archivo o directorio" execv(). He intentado reemplazarlo catcon un simple script de shell y he confirmado la ruta correcta, pero tampoco funcionará.
Haravikk