I am trying to create a simple comunication between 2 processes in C++ ( Windows ) like FIFO in linux. This is my server:
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; }
And this is my client:
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; }
The code does't work , how can i fixed it to like FIFO ?
To create an instance of a named pipe by using CreateNamedPipe, the user must have FILE_CREATE_PIPE_INSTANCE access to the named pipe object. If a new named pipe is being created, the access control list (ACL) from the security attributes parameter defines the discretionary access control for the named pipe.
A simple exampleCall CreateNamedPipe(..) to create an instance of a named pipe. Call ConnectNamedPipe(..) to wait for the client program to connect. Call WriteFile(..) to send data down the pipe. Call CloseHandle(..) to disconnect and close the pipe instance.
A named pipe is a named, one-way or duplex pipe for communication between the pipe server and one or more pipe clients. All instances of a named pipe share the same pipe name, but each instance has its own buffers and handles, and provides a separate conduit for client/server communication.
Every pipe is placed in the root directory of the named pipe filesystem (NPFS), mounted under the special path \\. \pipe\ (that is, a pipe named "foo" would have a full path name of \\. \pipe\foo ).
You cannot create a named pipe by calling CreateFile(..)
.
Have a look at the pipe examples of the MSDN. Since these examples are quite complex I've quickly written a VERY simple named pipe server and client.
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; }
And here is the client code:
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); }
You should replace the name of the pipe TEXT("\\\\.\\pipe\\Pipe")
by a #define which is located in a commonly used header file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With