Я хочу использовать IP C с использованием именованных каналов. Вот тестовый клиент / сервер, который я попытался создать для связи между двумя процессами Код клиента:
#include <iostream>
#include <Windows.h>
int main()
{
HANDLE pipe = CreateFileA("\\\\.\\pipe\\DokiDoki", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (pipe != INVALID_HANDLE_VALUE) {
char buffer[] = "DokiDoki from the other side :P";
DWORD bytesWritten;
WriteFile(pipe, static_cast<LPCVOID>(buffer), sizeof(buffer), &bytesWritten, NULL);
std::cout << "Done!\n";
CloseHandle(pipe);
}
else {
std::cout << "Could not get a handle to the pipe!\n";
return 1;
}
return 0;
}
Код сервера:
#include <iostream>
#include <array>
#include <Windows.h>
int main()
{
char buffer[1024];
HANDLE pipe = CreateNamedPipeA("\\\\.\\pipe\\DokiDoki", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, sizeof(buffer), sizeof(buffer), NMPWAIT_USE_DEFAULT_WAIT, NULL);
while (pipe != INVALID_HANDLE_VALUE) {
if (!ConnectNamedPipe(pipe, NULL)) {
//Setting a breakpoint here will never trigger.
DWORD bytesRead = 0;
while (ReadFile(pipe, static_cast<LPVOID>(buffer), sizeof(buffer) - 1, &bytesRead, NULL)) {
std::cout << buffer << std::endl;
}
}
DisconnectNamedPipe(pipe);
}
return 0;
}
Программа останавливается на ConnectNamedPipe и не будет выполняться любые другие инструкции, даже когда клиент подключается и записывает в канал. WriteFile (на клиенте) возвращает истину.