Я пытаюсь реализовать базовую реализацию именованного канала.
В моем клиентском коде, если я вызываю fun()
только один раз, тогда моя программа работает полностью нормально.
Но когда я звоню fun()
более одного раза, тогда он альтернативно завершается (например, если я звоню fun()
3 раза, первый вызов будет успешным, второй вызов завершится неудачно, а третий вызов пройдет нормально.
При сбое вызова в GetLastError()
я получаю 231
в качестве вывода на моем экране.
Если я использую Sleep()
после каждого fun()
вызова в клиенте, тогда моя программа работает нормально для каждого fun()
вызова.
Если я использую Sleep()
в своей серверной программе, то она читает из буфера только один раз, и все вызовы (после первого вызова) на fun()
не выполняются на стороне клиента.
Код сервера:
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include<stdlib.h>
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, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists...
1,
1024 * 16,
1024 * 16,
INFINITE,
NULL);
while (hPipe != INVALID_HANDLE_VALUE)
{
switch (ConnectNamedPipe(hPipe, NULL) ? NOERROR : GetLastError())
{
case NOERROR:
case ERROR_PIPE_CONNECTED: // STATUS_PIPE_CONNECTED
case ERROR_NO_DATA: // STATUS_PIPE_CLOSING
while (ReadFile(hPipe, buffer, sizeof(buffer)-1, &dwRead, NULL))
{
// do something with data in buffer
//Sleep(2000);
buffer[dwRead] = '\0';
printf("%s", buffer);
}
DisconnectNamedPipe(hPipe);
break;
}
//CloseHandle(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\n",
12, // = length of string + '\0'
&dwWritten,
NULL);
CloseHandle(hPipe);
}
else
{
cout<<"****";
cout<<GetLastError();
cout<<"****";
}
}
int main(void)
{
fun(); //Success
//Sleep(2000);
fun(); //failure
//Sleep(2000);
fun(); //Success
//Sleep(2000);
fun(); //failure
//Sleep(2000);
fun(); //Success
return (0);
}