This post is related to my Previous Post. There I was creating the PipeServer and Client as two separate programme and was trying to write to the server and getting a response back.And the programme was going to an infinite loop.
So for the sake of simplicity I combined both the Client and Server into a Single programme and run. Now I am getting System Error Code 997 i.e: Overlapped I/O operation is in progress
. Tried out different parameter options , unable to figure out the main reason. Any Idea how to go with this Error Code.
The Code snippet is below:
#include "stdafx.h"
//#include "WindowService.h"
#include "iostream"
#include "fstream"
using namespace std;
#define BUFSIZE 512
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallService();
BOOL DeleteService();
cWindowsService m_WindowsService;
int main()
{
HANDLE hPipe;
LPTSTR lpszPipename;
LPTSTR lpszWrite = TEXT("Default message from client");
TCHAR chReadBuf[BUFSIZE];
lpszPipename = TEXT("\\\\.\\pipe\\1stPipe");
BOOL fSuccess;
DWORD cbRead, dwMode;
OVERLAPPED m_OverLaped;
HANDLE hEvent;
HANDLE hPipeC;
//HANDLE hPipe;
hPipe=CreateNamedPipe(
lpszPipename,PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
PIPE_UNLIMITED_INSTANCES,BUFSIZE,
BUFSIZE,0,NULL
);
//hEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
m_OverLaped.hEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
m_OverLaped.Internal=0;
m_OverLaped.InternalHigh=0;
m_OverLaped.Offset=0;
m_OverLaped.OffsetHigh=0;
if (hPipe != INVALID_HANDLE_VALUE)
if (GetLastError() != ERROR_PIPE_BUSY)
{
if(GetLastError()==0)
{
printf("Successfully Created %s\n",lpszPipename);
}
else
printf( TEXT("Can not Create NamedPipe\n[GLE=%d]\n"), GetLastError() );
//return -1;
}
ConnectNamedPipe(hPipe,&m_OverLaped);
hPipeC=CreateFile(
lpszPipename, //Gets the Pipename
GENERIC_READ | GENERIC_WRITE, //Client only writes to this pipe.
0, //Do not share this pipe with others.
NULL, //Do not inherit security.
OPEN_EXISTING, //Pipe must exist.
FILE_ATTRIBUTE_NORMAL, //I have no special requirements on
//file attributes
NULL
);
dwMode = PIPE_READMODE_MESSAGE;
fSuccess = SetNamedPipeHandleState(
hPipe, // pipe handle
&dwMode, // new pipe mode
NULL, // don't set maximum bytes
NULL
); // don't set maximum time
fSuccess = TransactNamedPipe(
hPipe, // pipe handle
lpszWrite, // message to server
(lstrlen(lpszWrite)+1)*sizeof(TCHAR), // message length
chReadBuf, // buffer to receive reply
BUFSIZE*sizeof(TCHAR), // size of read buffer
&cbRead, // bytes read
&m_OverLaped
);
printf("GLE=%d.\n",GetLastError());
if (!fSuccess && (GetLastError() != ERROR_MORE_DATA))
{
printf("TransactNamedPipe failed with GLE=%d.\n",GetLastError());
return 0;
}
while(1)
{
printf(TEXT("%s\n"), chReadBuf);
// Break if TransactNamedPipe or ReadFile is successful
if(fSuccess)
break;
DWORD nBytesTransfered=1000;
DWORD *lpBytesTransfered;
lpBytesTransfered=&nBytesTransfered;
WaitForSingleObject( m_OverLaped.hEvent,15000);
GetOverlappedResult(hPipe,&m_OverLaped,lpBytesTransfered,true);
// Read from the pipe if there is more data in the message.
fSuccess = ReadFile(
hPipe, // pipe handle
chReadBuf, // buffer to receive reply
BUFSIZE*sizeof(TCHAR), // size of buffer
&cbRead, // number of bytes read
&m_OverLaped); // not overlapped
// Exit if an error other than ERROR_MORE_DATA occurs.
if( !fSuccess && (GetLastError() != ERROR_MORE_DATA))
break;
else printf( TEXT("%s\n"), chReadBuf);
}
}