#include "stdafx.h"
#include "../include/public.h"
int main(int argc, char* argv[])
{
char szPipe[250] = ".//pipe//sms";
//创建服务端只读命名管道
HANDLE hPipe = CreateNamedPipe( szPipe, PIPE_ACCESS_INBOUND,
PIPE_TYPE_BYTE|PIPE_WAIT, 100, 0, 0, 150, NULL );
if ( hPipe==HANDLE(-1) ){
cerr << "无法创建命名管道 " << szPipe << endl;
return 1;
}
cout << "命名管道 " << szPipe << " 创建完毕" << endl;
//读取信息
if ( !ConnectNamedPipe( hPipe, NULL ) ){
cerr << "无法连接命名管道 " << szPipe << endl;
CloseHandle( hPipe );
return 1;
}
while ( 1 ){
char szMsg[512] = "";
DWORD dwSize = 512,
dwBytesRead = 0;
OVERLAPPED overlappedInfo;
memset( &overlappedInfo, 0, sizeof(OVERLAPPED) );
overlappedInfo.Offset = 0;
overlappedInfo.OffsetHigh = 0;
HANDLE hEvent = CreateEvent( 0, TRUE, FALSE, 0 );
overlappedInfo.hEvent = hEvent;
if ( !ReadFile( hPipe, szMsg, dwSize, &dwBytesRead, &overlappedInfo ) &&
GetLastError()==ERROR_IO_PENDING ) {
do {
cout << endl << "等待读取..." << endl;
}while ( WaitForSingleObject( overlappedInfo.hEvent, 500 )==WAIT_TIMEOUT );
/*
cerr << "无法读取命名管道 " << szPipe << " 的消息" << endl;
CloseHandle( hPipe );
return 1;
*/
}
cout << szMsg << endl;
Sleep( 500 );
}//while
return 0;
}
客户端
// NamedPipeClient.cpp : Defines the entry point for the console application.
// 命名管道客户端
#include "stdafx.h"
#include "../include/public.h"
int main(int argc, char* argv[])
{
char szMachine[250] = "";
char szPipe[512] = "";
cout << "输入主机名称:";
cin >> szMachine;
sprintf( szPipe, "%s//pipe//sms", szMachine );
HANDLE hPipe = CreateFile( szPipe, GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if ( hPipe==HANDLE(-1) ){
char szErr[256] = "";
DWORD dwErr = GetLastError();
GetErrorMsg( szErr, 256 );
cerr << "打开命名管道 " << szPipe << " 失败: 0x" << hex << GetLastError() << ":" << szErr << endl;
return 1;
}
while ( 1 ){
char szMsg[80] = "test string";
DWORD dwSize = 80,
dwBytesWritten = 0;
cout << "输入消息(50字符):";
cin >> szMsg;
OVERLAPPED overlappedInfo;
memset( &overlappedInfo, 0, sizeof(OVERLAPPED) );
overlappedInfo.Offset = 0;
overlappedInfo.OffsetHigh = 0;
HANDLE hEvent = CreateEvent( 0, TRUE, FALSE, 0 );
overlappedInfo.hEvent = hEvent;
if ( !WriteFile( hPipe, szMsg, strlen( szMsg ) + 1, &dwBytesWritten, &overlappedInfo ) &&
GetLastError()==ERROR_IO_PENDING ){
do {
cout << endl << "等待写入..." << endl;
}while ( WaitForSingleObject( overlappedInfo.hEvent, 500 )==WAIT_TIMEOUT );
//cerr << "写入命名管道 " << szPipe << " 失败: 0x" << hex << GetLastError() << endl;
//CloseHandle( hPipe );
//return 1;
}
Sleep( 1000 );
}
return 0;
}
#include "../include/public.h"
int main(int argc, char* argv[])
{
char szPipe[250] = ".//pipe//sms";
//创建服务端只读命名管道
HANDLE hPipe = CreateNamedPipe( szPipe, PIPE_ACCESS_INBOUND,
PIPE_TYPE_BYTE|PIPE_WAIT, 100, 0, 0, 150, NULL );
if ( hPipe==HANDLE(-1) ){
cerr << "无法创建命名管道 " << szPipe << endl;
return 1;
}
cout << "命名管道 " << szPipe << " 创建完毕" << endl;
//读取信息
if ( !ConnectNamedPipe( hPipe, NULL ) ){
cerr << "无法连接命名管道 " << szPipe << endl;
CloseHandle( hPipe );
return 1;
}
while ( 1 ){
char szMsg[512] = "";
DWORD dwSize = 512,
dwBytesRead = 0;
OVERLAPPED overlappedInfo;
memset( &overlappedInfo, 0, sizeof(OVERLAPPED) );
overlappedInfo.Offset = 0;
overlappedInfo.OffsetHigh = 0;
HANDLE hEvent = CreateEvent( 0, TRUE, FALSE, 0 );
overlappedInfo.hEvent = hEvent;
if ( !ReadFile( hPipe, szMsg, dwSize, &dwBytesRead, &overlappedInfo ) &&
GetLastError()==ERROR_IO_PENDING ) {
do {
cout << endl << "等待读取..." << endl;
}while ( WaitForSingleObject( overlappedInfo.hEvent, 500 )==WAIT_TIMEOUT );
/*
cerr << "无法读取命名管道 " << szPipe << " 的消息" << endl;
CloseHandle( hPipe );
return 1;
*/
}
cout << szMsg << endl;
Sleep( 500 );
}//while
return 0;
}
客户端
// NamedPipeClient.cpp : Defines the entry point for the console application.
// 命名管道客户端
#include "stdafx.h"
#include "../include/public.h"
int main(int argc, char* argv[])
{
char szMachine[250] = "";
char szPipe[512] = "";
cout << "输入主机名称:";
cin >> szMachine;
sprintf( szPipe, "%s//pipe//sms", szMachine );
HANDLE hPipe = CreateFile( szPipe, GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if ( hPipe==HANDLE(-1) ){
char szErr[256] = "";
DWORD dwErr = GetLastError();
GetErrorMsg( szErr, 256 );
cerr << "打开命名管道 " << szPipe << " 失败: 0x" << hex << GetLastError() << ":" << szErr << endl;
return 1;
}
while ( 1 ){
char szMsg[80] = "test string";
DWORD dwSize = 80,
dwBytesWritten = 0;
cout << "输入消息(50字符):";
cin >> szMsg;
OVERLAPPED overlappedInfo;
memset( &overlappedInfo, 0, sizeof(OVERLAPPED) );
overlappedInfo.Offset = 0;
overlappedInfo.OffsetHigh = 0;
HANDLE hEvent = CreateEvent( 0, TRUE, FALSE, 0 );
overlappedInfo.hEvent = hEvent;
if ( !WriteFile( hPipe, szMsg, strlen( szMsg ) + 1, &dwBytesWritten, &overlappedInfo ) &&
GetLastError()==ERROR_IO_PENDING ){
do {
cout << endl << "等待写入..." << endl;
}while ( WaitForSingleObject( overlappedInfo.hEvent, 500 )==WAIT_TIMEOUT );
//cerr << "写入命名管道 " << szPipe << " 失败: 0x" << hex << GetLastError() << endl;
//CloseHandle( hPipe );
//return 1;
}
Sleep( 1000 );
}
return 0;
}