Necesito una forma de notificar a mi aplicación de espacio de usuario cuando una interfaz de red está habilitada o deshabilitada. Espero hacer esto sin recurrir a las encuestas. ¿El kernel ofrece algún tipo de enlace para activar las funciones de devolución de llamada cuando ocurren eventos relacionados con la red?Obtenga una notificación sobre el cambio de la interfaz de red en Linux
Respuesta
creo que el enlace de red (man 7 netlink
) instalación proporciona información sobre las interfaces de red a través de la NETLINK_ROUTE
familia (man 7 rtnetlink
). Puede obtener select()
o poll()
en un socket de netlink para obtener la información que desea. Aunque no estoy seguro de esto; No lo he usado yo mismo.
En un nivel superior, si el sistema está ejecutando NetworkManager, emitirá eventos a través de D-Bus cuando cambie el estado de la red del sistema. El navegador Epiphany usa estos eventos, por ejemplo, para activar automáticamente el modo "Trabajar sin conexión" cuando el sistema pierde su conexión de red, y volver al modo en línea cuando se reanuda la conectividad de red. Existen bibliotecas de clientes D-Bus para una variedad de idiomas, y es menos específico de la plataforma que netlink, por lo que esto es lo que recomiendo usar.
Opciones:
ifplugd
se ejecutará la secuencia de comandos de su elección cuando un cable está conectado a o se desconecta de la interfaz de red.Si está utilizando Debian puede agregar una secuencia de comandos a los subdirectorios de
/etc/network
, donde hay scripts que se ejecutan cada vez que una interfaz sube o baja.Si ninguno de los anteriores es adecuado para sus necesidades, consulte D-Bus. Nunca tuve mucha suerte en usarlo con éxito, pero este es el tipo de cosa para la que fue diseñado.
Por qué no hacer un fork
en el código, usando popen
hacer cualquiera:
- Edición
tail -f /var/log/messages
buscandoeth*
interfaces de - Issue
ifconfig
para ver la lista de adaptadores de subir o bajar
y analizar los datos usando pregex
, hacer un sleep()
por un período de tiempo y volver a verificar de nuevo .. O podría ir a monitor th e instalación del registro del sistema usando las funciones 'syslog.h'.
Si usted se pega con el estándar POSIX, el código será portable a través de diferentes tipos de Unix/Linux/BSD ...
'ifconfig' no es POSIX y la salida en realidad varía bastante de UNIX a otro. Claro, es (la mayoría) lo mismo en todos los Linuxes, pero incluso allí hay dos versiones diferentes de uso común (Busybox y net-tools). – ephemient
sin necesidad de consultar o confiar en los ganchos del sistema operativo como Norman Ramsey sugirió, su única opción es revise periódicamente la interfaz de trabajo con respecto a lo que era hace unos segundos. Eso solo lleva a event/rx/tx queue hell, si la idea es poner en cola/bloquear la espera de la charla cuando el enlace no está disponible.
Además, las secuencias de comandos de Debian funcionan junto con las secuencias de comandos de inicio, los enlaces que proporcionan no le dicen si la raíz utilizó ifconfig para abajo o modificó una interfaz configurada, o configuró una nueva que no se describió para init . Solo le dicen si el usuario hizo algo a través de /etc/init.d/networking, o si init hizo lo mismo.
¿Qué es tan terriblemente miserable acerca de cómo iniciar un hilo para sondear en busca de cambios?
De eso, sí, podría iniciar un proceso 'netnicmond' que señala una lista de suscriptores para informarles que cambió algo, o uno más complejo que realmente transmitió los cambios. Probablemente usaría netlink para eso ...
¿Ha considerado usar netlink?
- 1. Obtenga una notificación sobre un cambio de página en UIWebView
- 2. Hacer interfaz de red virtual en Linux?
- 3. Linux: ¿Cómo forzar el uso de una interfaz de red específica?
- 4. Comprobación del estado de la interfaz de red asíncrona
- 5. boost :: asio - Aclaración sobre la vinculación a una interfaz de red específica
- 6. Obtenga el estado de la red de Windows 7
- 7. Obtenga una notificación cuando DTE.ActiveDocument cambie
- 8. Deshabilitar el administrador de red para una interfaz en particular
- 9. ¿Cómo recibir notificaciones sobre el cambio de estado de la red wifi?
- 10. Identificación de la interfaz de red activa
- 11. ¿Cómo se crea una interfaz de red virtual en Windows?
- 12. Notificación de cambio en MVVM jerarquías
- 13. Establecer la métrica de la interfaz de red
- 14. Mostrar una WinForm sobre el área de notificación
- 15. Simulación de interfaz de red en Python?
- 16. Notificación de cambio con Sql Server 2008
- 17. ¿Cómo cambio el ancho de la red de Twitter Bootstrap?
- 18. Notificación de cambio de trama UIView
- 19. Obtener la dirección IP de una interfaz en Linux
- 20. Cómo obtener la dirección IPv6 de una interfaz en Linux
- 21. casilla de verificación - notificación de cambio
- 22. Notificación de cambio de contacto nativo
- 23. JCheckbox change listener recibe una notificación de mouse sobre eventos
- 24. Envío de notificación al usuario sobre cambio de base de datos
- 25. (C, Linux) Saber si una interfaz de red es inalámbrica o cableada
- 26. Cómo determinar la interfaz de red de Internet en Java
- 27. Obtenga solo la interfaz directa en lugar de todas?
- 28. Obtenga el número de CPU en Linux utilizando C
- 29. Proceso de reinicio en el cambio de archivos en Linux
- 30. Obtenga una notificación cuando se agregue algo a NSPasteboard
Acerca de 'rtnetlink', es posible que desee comprobar este enlace para ver el código de ejemplo: http://stackoverflow.com/a/2353441/1435026 – fanyangxi