Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/03/2014, 16:37
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: comunicacion entre procesos

"...pero no estoy del todo seguro que esto limite el acceso desde fuera del pc lo que es muy importante..."

Bueno, una aplicacion hará de servidor y la otra de cliente, en el momento de recibir una conexion el servidor debe comprovar que el cliente viene de su misma ip, si no es asi cierra el socket y ya está.

Si lo haces con pipes tambien usaras el mismo modelo: una aplicacion hará de servidor de pipes y la otra de cliente, y al igual que los sockets una pipe cliente tambien puede conectarse a un pipe servidor abierto en otro pc. Seguramente en la msdn tendras mas informacion i mas detallada acerca de todo esto.

Busca el ejemplo basico de pipes, este sería un servidor (lo mas basico y sin control de errores, solo para ver como funciona):

Código C:
Ver original
  1. char buffer[512];
  2. unsigned long dw;
  3. HANDLE hPipe = CreateNamedPipe(
  4.                 "\\\\.\\pipe\\demopipe",
  5.                 PIPE_ACCESS_DUPLEX,
  6.                 PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,
  7.                 PIPE_UNLIMITED_INSTANCES,
  8.                 BUFSIZE,
  9.                 BUFSIZE,
  10.                 PIPE_TIMEOUT,
  11.                 0);
  12.  
  13. if(ConnectNamedPipe(hPipe, 0)) {//esto equivale al accept
  14.     ReadFile(hPipe, buffer, 512, &dw, 0);//esto equivale al recv
  15.     //aqui va la evaluacion de la peticion
  16.     WriteFile(hPipe, "dato", 4, &dw, 0);//y esto equivale al send
  17. }
  18.  
  19. FlushFileBuffers(hPipe);
  20. DisconnectNamedPipe(hPipe);
  21. CloseHandle(hPipe);

Y este un cliente:

Código C:
Ver original
  1. unsigned long dw;
  2. char buffer[512];
  3. HANDLE hPipe = CreateFile("\\\\.\\pipe\\demopipe", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
  4.  
  5. if(!WaitNamedPipe("\\\\.\\pipe\\demopipe", 10000))
  6.     //pipe no disponible
  7. }
  8. else {
  9.     dw = PIPE_READMODE_MESSAGE;
  10.     SetNamedPipeHandleState(hPipe, &dw, 0, 0);
  11.  
  12.     WriteFile(hPipe, "hola", 4, &dw, 0);
  13.     ReadFile(hPipe, buffer, 512, &dw, 0);
  14. }
  15.  
  16. CloseHandle(hPipe);

Observa la similitud que hay en el funcionamiento de los pipes con los sockets. Observa que el cliente accede al pipe con CreateFile, y esta funcion te permite definir permisos de seguridad. Revisa algun manual de win32 para obtener mas informacion acerca de las funciones usadas. Lo demas es lo mismo en ambos casos: puedes cifrar los datos, puedes definir un protocolo para organizar los tramites, etc...

Saludos
vosk