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.