Pipe Server example
Description
This sample read data file "gamma.dat" come with Origin, and send to local "OriginTestPipe" pipe. Here use "LT_execute("sec -p 1");" as time delay to simulate sending a data to pipe every second. See Client Sample
Sameple codes
#include <Origin.h>
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Start your functions here.
#define PIPE_TIMEOUT 10000
#define BUFSIZE 10000
#define PIPENAME "\\\\.\\pipe\\OriginTestPipe"
//err will just printf in this function so just return void
static void do_pipe_process(HANDLE hPipe, string strFileName = "Samples\\Curve Fitting\\gamma.dat")
{
stdioFile ff;
string strFilename = GetAppPath(TRUE) + strFileName;
bool bRet = ff.Open(strFilename, file::modeRead);
if(!bRet)
{
out_str(strFilename + " not found!");
return;
}
printf("Pipe handle = %X\nHit Escape to abort!\nSending Data..\n", (int)hPipe);
waitCursor cur;
string strTemp;
int ii=0;
while(!cur.CheckEsc() && ff.ReadString(strTemp))
{
DWORD nWritten, nBytes = strTemp.GetLength()+1;
LPSTR lpbuff = strTemp.GetBuffer(nBytes);
out_str(lpbuff); // show locally to script window
BOOL bSuccess = WriteFile(
hPipe, // handle to pipe
lpbuff, // buffer to write from
nBytes, // number of bytes to write
&nWritten, // number of bytes written
NULL); // not overlapped I/O
if (! bSuccess || nBytes != nWritten)
{
printf("success=%d, %d bytes written out of %d\n", bSuccess, nWritten, nBytes);
break;
}
// just simulate the speed of slow external hardware data generator
// delay 1 sec,
LT_execute("sec -p 1");
}
ff.Close();
out_str("END!");
}
int testpipserver()
{
BOOL bConnected;
HANDLE hPipe;
// create named pipe
hPipe = CreateNamedPipe(
PIPENAME, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
PIPE_TIMEOUT, // client time-out
NULL); // no security attribute
if (hPipe == INVALID_HANDLE_VALUE)
{
out_str("Could not CreatePipe: " + PIPENAME);
return -1;
}
printf("%s is setup, waiting for client request.\n", PIPENAME);
if(ConnectNamedPipe(hPipe, NULL))
{
do_pipe_process(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
}
else
{
// The client could not connect, so close the pipe.
out_str("failed in connect!");
CloseHandle(hPipe);
return -1;
}
return 0;
}
|