Мне нужно, чтобы мой клиент сначала проверил, читает ли сервер данные из канала, если да, то подождите, пока сервер не будет сделан, иначе запишите данные в канал. Если я не использую команду sleep в моей клиентской программе, Сервер не будет правильно читать сообщение. Я нашел причину этой проблемы в документации, в которой говорится:
Этот буфер должен оставаться действительным в течение всей операции чтения. Вызывающая сторона не должна использовать этот буфер до завершения операции чтения.
Но в нем не указано, как заблокировать клиент до завершения операции чтения.
Код сервера:
#include<stdio.h>
#include<windows.h>
#include<iostream>
using namespace std;
int main(void)
{
HANDLE hPipe;
char buffer[1024];
DWORD dwRead;
hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\Pipe"),
PIPE_ACCESS_INBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
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;
}
Код клиента:
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
void fun()
{
HANDLE hPipe;
DWORD dwWritten;
hPipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"),
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hPipe != INVALID_HANDLE_VALUE)
{
WriteFile(hPipe,
"Hello Pipe",
11, // = length of string + terminating '\0' !!!
&dwWritten,
NULL);
CloseHandle(hPipe);
}
}
int main(void)
{
int a = 5;
cout<<a;
for(int i = 0; i<a; i++)
{
fun();
Sleep(2000);
}
return (0);
}
Это просто пример программы, на самом деле мой клиент - очень большое приложение, в котором много функций, и я не хочу вносить в него какие-либо серьезные изменения. Всякий раз, когда запускается определенная функция, она должна передавать данные на сервер. Тип данных - это структура. После получения данных на сервере я хочу записать эти данные в текстовый файл (после преобразования в формат json).
Так, как я могу заставить моего клиента проверять, завершил ли сервер чтение данных из канала перед записью данных в канал? Клиент не должен ждать сервера вечно, так как это повлияет на мое клиентское приложение. Следует подождать указанный интервал времени. Кроме того, чтобы передать структуру, какой режим трубы я должен использовать БАЙТ РЕЖИМ или СООБЩЕНИЕ РЕЖИМ?