通过 Named Pipe 实现进程间通讯
来源:互联网 发布:js 对象转字符串 编辑:程序博客网 时间:2024/06/07 02:46
// 启动服务
void CMyDlg::OnStart()
{
CString lpPipeName = "\\\\.\\Pipe\\NamedPipe" ;
for ( UINT i = 0; i < nMaxConn; i++ )
{
// 创建管道实例
PipeInst[i].hPipe = CreateNamedPipe ( lpPipeName, PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED, \
PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, nMaxConn, 0, 0, 1000, NULL ) ;
if ( PipeInst[i].hPipe == INVALID_HANDLE_VALUE )
{
DWORD dwErrorCode = GetLastError () ;
this->MessageBox ( "创建管道错误!" ) ;
return ;
}
// 为每个管道实例创建一个事件对象,用于实现重叠IO
PipeInst[i].hEvent = CreateEvent ( NULL, false, false, false ) ;
// 为每个管道实例分配一个线程,用于响应客户端的请求
PipeInst[i].hTread = AfxBeginThread ( ServerThread, &PipeInst[i], THREAD_PRIORITY_NORMAL ) ;
}
this->SetWindowText ( "命名管道实例之服务器(运行)" ) ;
this->MessageBox ( "服务启动成功" ) ;
}
// 停止服务
void CMyDlg::OnStop()
{
DWORD dwNewMode = PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_NOWAIT ;
for ( UINT i = 0; i < nMaxConn; i++ )
{
SetEvent ( PipeInst[i].hEvent ) ;
CloseHandle ( PipeInst[i].hTread ) ;
CloseHandle ( PipeInst[i].hPipe ) ;
}
this->SetWindowText ( "命名管道实例之服务器" ) ;
this->MessageBox ( "停止启动成功" ) ;
}
// 线程服务函数
UINT ServerThread ( LPVOID lpParameter )
{
DWORD nReadByte = 0, nWriteByte = 0, dwByte = 0 ;
char szBuf[MAX_BUFFER_SIZE] = {0} ;
PIPE_INSTRUCT CurPipeInst = *(PIPE_INSTRUCT*)lpParameter ;
OVERLAPPED OverLapStruct = { 0, 0, 0, 0, CurPipeInst.hEvent } ;
while ( true )
{
memset ( szBuf, 0, sizeof(szBuf) ) ;
// 命名管道的连接函数,等待客户端的连接(只针对NT)
ConnectNamedPipe ( CurPipeInst.hPipe, &OverLapStruct ) ;
// 实现重叠I/0,等待OVERLAPPED结构的事件对象
WaitForSingleObject ( CurPipeInst.hEvent, INFINITE ) ;
// 检测I/0是否已经完成,如果未完成,意味着该事件对象是人工设置,即服务需要停止
if ( !GetOverlappedResult ( CurPipeInst.hPipe, &OverLapStruct, &dwByte, true ) )
break ;
// 从管道中读取客户端的请求信息
if ( !ReadFile ( CurPipeInst.hPipe, szBuf, MAX_BUFFER_SIZE, &nReadByte, NULL ) )
{
MessageBox ( 0, "读取管道错误!", 0, 0 ) ;
break ;
}
int a, b ;
sscanf ( szBuf, "%d %d", &a, &b ) ;
pMyDlg->nFirst = a ;
pMyDlg->nSecond = b ;
pMyDlg->nResValue = a + b ;
memset ( szBuf, 0, sizeof(szBuf) ) ;
sprintf ( szBuf, "%d", pMyDlg->nResValue ) ;
// 把反馈信息写入管道
WriteFile ( CurPipeInst.hPipe, szBuf, strlen(szBuf), &nWriteByte, NULL ) ;
pMyDlg->SetDlgItemInt ( IDC_FIRST, a, true ) ;
pMyDlg->SetDlgItemInt ( IDC_SECOND, b, true ) ;
pMyDlg->SetDlgItemInt ( IDC_RESULT, pMyDlg->nResValue, true ) ;
// 断开客户端的连接,以便等待下一客户的到来
DisconnectNamedPipe ( CurPipeInst.hPipe ) ;
}
return 0 ;
}
- 通过 Named Pipe 实现进程间通讯
- 进程间通信---------有名管道(named pipe/FIFO)
- Linux进程间通过pipe通信
- Linux 进程间通讯方式 pipe()函数
- Linux进程间通讯方式之管道pipe
- 【IPC进程间通讯之二】管道Pipe
- Linux进程间通讯一--无名管道PIPE
- 通过Socket实现进程间异步通讯(一)
- 通过Socket实现进程间异步通讯(二)
- 通过Socket实现进程间异步通讯(三)
- 通过Socket实现进程间异步通讯(四)
- 通过Socket实现进程间异步通讯(一)
- 通过Socket实现进程间异步通讯(二)
- 通过Socket实现进程间异步通讯(三)
- 通过Socket实现进程间异步通讯(四)
- 在 AIX 上通过数据管道实现进程间通讯
- Linux进程通信IPC--管道Pipe/Named Pipe
- 进程/线程池/进程ID/进程间的通讯pipe/Queue/Manager/进程同步
- 求1000以内所有偶数的和
- 复选框实现单选
- mybatis动态sql
- Spring.Net+Nhibernate+ASP.MVC4.0+EasyUI实践(三)
- 构造函数调用几次
- 通过 Named Pipe 实现进程间通讯
- 服务器IP冲突 数据库无法连接
- JAVA--编写一个JFrame,标题为“计算的窗口”,在该窗口中组件的布局是FlowLayout。窗口中添加两个文本区,当我们在一个文本区中输入若干个数时,另一个文本区同时对输入的数进行求和运算并求
- oracle 回收站管理
- UITableView可编辑状态常用操作
- UITableViewCell编辑修改整体frame
- android 分辨率适配与dip(dp)的使用
- PHP基础常用正则表达式
- Skinny triangle