Pipe Client example

 

Description

This sample, read data from the pipe server and put them to worksheet directly. Here, for demo, use LT command to delay .3 seceond between read data from pipe. See Server Sample

Sample codes

#include <Origin.h>
#define PIPE_BUFFER_SIZE 1024
// if server is at a remote machine named dev4
//#define PIPENAME  "\\\\dev4\\pipe\\OriginTestPipe"
// for local server
#define PIPENAME  "\\\\.\\pipe\\OriginTestPipe" 
  
int testpipe_client(string strPipeName = PIPENAME, int nWaitLoops = 5)
{
        Worksheet wks = Project.ActiveLayer();
        if(!wks)
        {
                out_str("no active worksheet, abort.");
                return -1;
        }
        
    HANDLE hPipe; 
    string strMessage; 
    BOOL fSuccess; 
    int ii = 0;
    while(1)
    { 
        // Try to open a named pipe; wait for it, if necessary. 
        hPipe = CreateFile( 
             strPipeName, 
             GENERIC_READ | GENERIC_WRITE, 
             0,              // no sharing 
             NULL,           // no security attributes
             OPEN_EXISTING,  // opens existing pipe 
             0,              // default attributes 
             NULL);          // no template file 
    
        // Break if the pipe handle is valid. 
        if (hPipe != INVALID_HANDLE_VALUE) 
            break; 
     
        // All pipe instances are busy, so wait for 20 seconds. 
        if (!WaitNamedPipe(strPipeName, 20000) || ++ii > nWaitLoops) 
        {
            out_str("Could not open pipe " + strPipeName); 
            return -2;          
        }
    } 
    
    // The pipe connected; change to message-read mode. 
    DWORD 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 
    if (!fSuccess) 
    {
                CloseHandle(hPipe); 
        out_str("failed at SetNamedPipeHandleState"); 
        return -3;          
    }
    
        char chBuf[PIPE_BUFFER_SIZE]; 
    DWORD cbRead, cbWritten;
    
        while(1) 
    { 
        // Read from the server pipe. 
        fSuccess = ReadFile( 
             hPipe,    // pipe handle 
             chBuf,    // buffer to receive reply 
             PIPE_BUFFER_SIZE,      // size of buffer 
             &cbRead,  // number of bytes read 
             NULL);    // not overlapped 
    
        if (! fSuccess ) //nothing more to read, quit
            break; 
    
        // put data to worksheet
        wks.PasteData(chBuf);
        
        // delay .3 second 
        LT_execute("sec -p 0.3");
        
    } 
    CloseHandle(hPipe); 
    
    out_str("Done!");
    return 0; 
}