views:

42

answers:

1

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); 
       }



}
A: 

MSDN has an example that does just what you're trying to do, I suggest you check it out: Named Pipe Server and Named Pipe Client (added from comment).

Another suggestion is that you try first without using overlapped IO as it complicates matters a bit and then once you get it working without overlapped IO you can introduce it again.

Andreas Magnusson
Just to make it Clear Who is seeking for Answer:The Server namedPipe:http://msdn.microsoft.com/en-us/library/aa365603%28v=VS.85%29.aspx and The Client Named Pipe:http://msdn.microsoft.com/en-us/library/aa365592(v=VS.85).aspx
Subhen
Thanks, I've edited the response to point out both examples.
Andreas Magnusson