c++11 ipc fifo

c++11 - Crear una tubería con nombre C++ Windows



ipc fifo (1)

Estoy tratando de crear una comunicación simple entre 2 procesos en C ++ (Windows) como FIFO en Linux. Este es mi servidor:

int main() { HANDLE pipe = CreateFile(TEXT("////.//pipe//Pipe"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); ConnectNamedPipe(pipe, NULL); while(TRUE){ string data; DWORD numRead =1 ; ReadFile(pipe, &data, 1024, &numRead, NULL); cout << data << endl; } CloseHandle(pipe); return 0; }

Y este es mi cliente:

int main() { HANDLE pipe = CreateFile(TEXT("////.//pipe//Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); ConnectNamedPipe(pipe, NULL); string message = "TEST"; DWORD numWritten; WriteFile(pipe, message.c_str(), message.length(), &numWritten, NULL); return 0; }

El código no funciona, ¿cómo puedo arreglarlo para que me guste FIFO?


No puede crear una canalización con nombre llamando a CreateFile(..) .

Echa un vistazo a los ejemplos de tuberías de la MSDN . Dado que estos ejemplos son bastante complejos, rápidamente escribí un servidor y cliente de tubería con nombre MUY simple.

int main(void) { HANDLE hPipe; char buffer[1024]; DWORD dwRead; hPipe = CreateNamedPipe(TEXT("////.//pipe//Pipe"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 1, 1024 * 16, 1024 * 16, NMPWAIT_USE_DEFAULT_WAIT, NULL); while (hPipe != INVALID_HANDLE_VALUE) { if (ConnectNamedPipe(hPipe, NULL) != FALSE) // wait for someone to connect to the pipe { while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) { /* add terminating zero */ buffer[dwRead] = ''/0''; /* do something with data in buffer */ printf("%s", buffer); } } DisconnectNamedPipe(hPipe); } return 0; }

Y aquí está el código del cliente:

int main(void) { HANDLE hPipe; DWORD dwWritten; hPipe = CreateFile(TEXT("////.//pipe//Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hPipe != INVALID_HANDLE_VALUE) { WriteFile(hPipe, "Hello Pipe/n", 12, // = length of string + terminating ''/0'' !!! &dwWritten, NULL); CloseHandle(hPipe); } return (0); }

Debe reemplazar el nombre del TEXT("////.//pipe//Pipe") tubería TEXT("////.//pipe//Pipe") por un #define que se encuentra en un archivo de encabezado de uso común.