2009-11-17 13 views
17

¿Hay alguna razón para favorecer canalizaciones con nombre sobre sockets para IPC local (tanto con win-api), effective-wize, resource-wize o de otro modo, ya que ambas se comportan muy parecidas (y probablemente se abstraigan mediante una interfaz similar de todos modos), en una aplicación que probablemente ya use sockets para fines de red de todos modos?Sockets vs named pipes para IPC local en Windows?

Puedo nombrar al menos el problema de direccionamiento: números de puerto para sockets contra nombres de archivo para pipes. Además, los conductos con nombre (AFAIK) no alertarán al cortafuegos (diálogo de bloqueo/desbloqueo), aunque las aplicaciones bloqueadas todavía se pueden comunicar a través de los enchufes de forma local. ¿Algo más para tener en cuenta?

En el caso de usar sockets, ¿hay alguna configuración/indicadores winsock que se recomiendan cuando se usan sockets localmente?

Respuesta

15

algunas diferencias sutiles:

sockets no funcionará para IPC local si usted no tiene un adaptador de funcionamiento. ¿Qué tan común es tener una PC sin un adaptador que funcione? Bueno, me picaron cuando alguien intentó demostrar nuestro software a un cliente en una computadora portátil que no estaba conectada a una red o 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 evitar esto instalando un adaptador de bucle invertido, pero eso no es 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. Named pipes can have firewalls too.

Puede tener problemas debido a los privilegios necesarios para crear canalizaciones con nombre, o para crear nuevas instancias de canalizaciones con nombre. Por ejemplo, estaba ejecutando varios servidores usando el mismo conducto con nombre (probablemente no era una buena idea, pero esto fue para probar) y algunos fallaron en CreateNamedPipe porque el primer servidor para crear el conducto se estaba ejecutando 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 nivel de UAC normal.

Aunque el artículo mencionado por Rubens se trata principalmente de IPC a través de una red, sí señala que "las tuberías con nombre local se ejecutan en modo kernel y es extremadamente rápido".

+7

Las PC con Windows siempre tienen una interfaz de bucle invertido virtual instalada. No necesita tener un adaptador de red o un controlador en la PC para usar los enchufes de Windows. Use la dirección IP 127.0.0.1 para abordar sus procesos locales. – phord

4

Otra solución que quizás desee considerar es una región de memoria compartida con nombre. Es un poco de trabajo porque debe establecer usted mismo un protocolo de control de flujo, pero lo he utilizado con éxito en el pasado, donde la velocidad era lo más importante.