Я написала две программы. Одна клиент, другая сервер. Клиент отсылает серверу сообщение, тот принимает и отсылает его обратно! Нужно сделать синхронизацию семафорами.. У меня не как не выходит. Помогите пожалуйста =)
Вот мои коды:
Клиент
Код:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
DWORD main(int argc, char *argv[])
{
HANDLE hNamedPipe;
DWORD cbWritten;
DWORD cbRead;
char szBuf[1024];
wchar_t namesem[256]=L"sema";
HANDLE sem = CreateSemaphore(NULL, 0, 1, namesem);
wchar_t szPipeName[256]=L"\\\\.\\pipe\\$MyPipe$";
printf("Named pipe client demo\n");
printf("Syntax: pipec [servername]\n");
hNamedPipe = CreateFile(
szPipeName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if(hNamedPipe == INVALID_HANDLE_VALUE)
{
fprintf(stdout,"CreateFile: Error %ld\n",
GetLastError());
getch();
return 0;
}
fprintf(stdout,"\nConnected. Type 'exit' to terminate\n");
while(1)
{
printf("cmd>");
gets(szBuf);
if(!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1,
&cbWritten, NULL))
break;
WaitForSingleObject(sem ,INFINITE);
if(ReadFile(hNamedPipe, szBuf, 1024, &cbRead, NULL))
printf("Received back: <%s>\n", szBuf);
else
{
fprintf(stdout,"ReadFile: Error %ld\n",
GetLastError());
getch();
break;
}
if(!strcmp(szBuf, "exit"))
break;
}
CloseHandle(hNamedPipe);
return 0;
}
Сервер
Код:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main()
{
BOOL fConnected;
HANDLE hNamedPipe;
wchar_t lpszPipeName[256] = L"\\\\.\\pipe\\$MyPipe$";
char szBuf[1024];
wchar_t namesem[256]=L"sema";
DWORD cbRead;
DWORD cbWritten;
int pop;
HANDLE sem = OpenSemaphore(NULL, true, namesem);
printf("Named pipe server demo\n");
hNamedPipe = CreateNamedPipe(
lpszPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
512,
512,
5000,NULL
);
if(hNamedPipe == INVALID_HANDLE_VALUE)
{
fprintf(stdout,"CreateNamedPipe: Error %ld\n",
GetLastError());
getch();
return 0;
}
fprintf(stdout,"Waiting for connect...\n");
fConnected = ConnectNamedPipe(hNamedPipe, NULL);
if(!fConnected)
{
switch(GetLastError())
{
case ERROR_NO_DATA:
fprintf(stdout,"ConnectNamedPipe: ERROR_NO_DATA");
getch();
CloseHandle(hNamedPipe);
return 0;
break;
case ERROR_PIPE_CONNECTED:
fprintf(stdout,
"ConnectNamedPipe: ERROR_PIPE_CONNECTED");
getch();
CloseHandle(hNamedPipe);
return 0;
break;
case ERROR_PIPE_LISTENING:
fprintf(stdout,
"ConnectNamedPipe: ERROR_PIPE_LISTENING");
getch();
CloseHandle(hNamedPipe);
return 0;
break;
case ERROR_CALL_NOT_IMPLEMENTED:
fprintf(stdout,
"ConnectNamedPipe: ERROR_CALL_NOT_IMPLEMENTED");
getch();
CloseHandle(hNamedPipe);
return 0;
break;
default:
fprintf(stdout,"ConnectNamedPipe: Error %ld\n",
GetLastError());
getch();
CloseHandle(hNamedPipe);
return 0;
break;
}
CloseHandle(hNamedPipe);
getch();
return 0;
}
fprintf(stdout,"\nConnected. Waiting for command...\n");
while(1)
{
if(ReadFile(hNamedPipe, szBuf, 1024, &cbRead, NULL))
{ReleaseSemaphore(sem ,1, NULL);
if(!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1,
&cbWritten, NULL))
break;
printf("Received: <%s>\n", szBuf);
if(!strcmp(szBuf, "exit"))
break;
}
}
CloseHandle(hNamedPipe);
return 0;
}
___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.