winapi - sistemas - ¿Sockets vs tuberías con nombre para IPC local en Windows?
qué es un pipe (2)
¿Hay alguna razón para favorecer las canalizaciones con nombre a través de sockets para IPC local (ambas con win-api), efectividad-wize, recurso-wize o de otra manera, ya que ambas se comportan de manera muy parecida (y es probable que se abstraigan con una interfaz similar)? en una aplicación que es probable que ya use sockets para propósitos de red de todos modos?
Puedo nombrar al menos el problema de direccionamiento: números de puerto para sockets contra nombres de archivo para tuberías. Además, las canalizaciones con nombre (AFAIK) no alertarán al firewall (diálogo de bloqueo / desbloqueo), aunque las aplicaciones bloqueadas todavía pueden comunicarse a través de sockets localmente. ¿Algo más a tener en cuenta?
En el caso de usar sockets, ¿hay alguna configuración / marca de winsock que se recomiende cuando se usan sockets localmente?
Algunas diferencias sutiles:
Los sockets no funcionarán para IPC local si no tiene un adaptador que funcione. ¿Qué tan común es tener una PC sin un adaptador que funcione? Bueno, me picaron cuando alguien intentó mostrar nuestro software a un cliente en una computadora portátil que no estaba conectada a una red o a una fuente de alimentación (por lo que el sistema operativo deshabilitó la tarjeta de red para ahorrar energía) y el adaptador inalámbrico se deshabilitó (porque el usuario de la computadora portátil no usó la conexión inalámbrica). Puede solucionar esto instalando un adaptador de bucle invertido, pero eso no es lo ideal.
El software de firewall puede causar problemas al establecer conexiones TCP / IP. No se supone que sea un problema para el IPC local, pero no estoy convencido. Las tuberías con nombre también pueden tener firewalls.
Es posible que tenga problemas debido a los privilegios necesarios para crear canalizaciones con nombre o para crear nuevas instancias de tuberías con nombre. Por ejemplo, estaba ejecutando varios servidores utilizando la misma canalización con nombre (probablemente no es una buena idea, pero esto fue para pruebas) y algunos fallaron en CreateNamedPipe porque el primer servidor para crear la tubería se ejecutaba en modo Administrador (porque se inició desde Visual Studio en modo Administrador) mientras que el resto se inició desde la línea de comandos con el nivel normal de UAC.
Aunque el artículo mencionado por Rubens trata sobre todo de IPC a través de una red, señala que "las tuberías locales con nombre se ejecutan en modo kernel y son extremadamente rápidas".
Otra solución que puede considerar es una región de memoria compartida con nombre. Es un poco de trabajo porque tiene que establecer un protocolo de control de flujo, pero lo he usado con éxito en el pasado, donde la velocidad era lo más importante.