que - ¿Es confiable enviar datos a través de sockets UDP en la misma máquina?
sockets en c linux (5)
Si utilizo sockets UDP para la comunicación entre procesos, ¿puedo esperar que el otro proceso reciba todos los datos de envío en el mismo orden?
Sé que esto no es cierto para UDP en general.
En resumen, no. No debe hacer suposiciones sobre el orden de los datos recibidos en un socket UDP, incluso sobre localhost. Podría funcionar, podría no funcionar, y no está garantizado.
La interfaz del socket probablemente no controlará el flujo del originador de los datos, por lo que probablemente verá una transmisión confiable si tiene un control de flujo de nivel más alto, pero siempre existe la posibilidad de que una falla en la memoria pueda causar un datagrama caído.
Sin un control de flujo que limite la asignación de memoria del kernel para datagramas, imagino que será tan poco fiable como la red UDP.
Loopback UDP es increíblemente poco fiable en muchas plataformas, puede ver fácilmente una pérdida de datos del 50% +. Se han dado varias excusas al efecto de que hay mecanismos de transporte mucho mejores para usar.
Hay muchas pilas de middleware disponibles en estos días para hacer que IPC sea más fácil de usar y multiplataforma. Observe algo como ZeroMQ o 29 West''s LBM que usan la misma API para comunicaciones entre procesos, IPC (interprocesos, interproceso) y redes.
No, no hay tal garantía, incluso con enchufes locales. Si desea un mecanismo de IPC que garantice la entrega ordenada, puede considerar usar tubos full-duplex con popen()
. Esto abre un conducto al proceso secundario que puede leer o escribir arbitrariamente. Garantizará la entrega ordenada y se puede usar con E / S síncronas o asíncronas ( select()
o poll()
), dependiendo de cómo quiera construir la aplicación.
En Unix hay otras opciones, como sockets de dominio de Unix o colas de mensajes de System V (algunas de las cuales pueden ser más rápidas), pero la lectura / escritura desde un conducto es muy simple y funciona. Como beneficio adicional, es fácil probar el proceso de su servidor porque solo está leyendo y escribiendo desde Stdio.
En las ventanas se puede ver en Named Pipes, que funcionan de manera diferente a su homónimo de Unix, pero se utilizan precisamente para este tipo de comunicación entre procesos.
No. He sido mordido por esto antes. Puede preguntarse cómo puede fallar, pero se encontrará con problemas de relleno de paquetes pendientes y, por consiguiente, se eliminarán los paquetes. La forma en que el subsistema de red suelta paquetes depende de la implementación y no se especifica en ningún lado.