No estoy seguro de si me he perdido algo de documentación o no, pero me está costando descubrir cómo configurar un launchd
agente 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 launchd
deberí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 getaddrinfo
errores ("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?
echo 'My message' | nc -uw 1 localhost 6000
enviar el mensaje a un servicio que escucha el puerto 6000 en su máquina local. No estoy seguro de si esnc
compatible 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.Respuestas:
Configuré este usando LaunchControl .
fuente
cat
como programa y redirigiendostdout
ystderr
(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 reemplazarlocat
con un simple script de shell y he confirmado la ruta correcta, pero tampoco funcionará.