Windows系统编程之进程间通信

Windows系统编程之进程间通信

ID:41032617

大小:34.50 KB

页数:5页

时间:2019-08-14

Windows系统编程之进程间通信_第1页
Windows系统编程之进程间通信_第2页
Windows系统编程之进程间通信_第3页
Windows系统编程之进程间通信_第4页
Windows系统编程之进程间通信_第5页
资源描述:

《Windows系统编程之进程间通信》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Windows系统编程之进程间通信.txt13母爱是迷惘时苦口婆心的规劝;母爱是远行时一声殷切的叮咛;母爱是孤苦无助时慈祥的微笑。Windows系统编程之进程间通信看雪技术论坛>编程开发>『Win32/Win64编程』>Windows系统编程之进程间通信二、命名管道命名管道具有以下几个特征:(1)命名管道是双向的,所以两个进程可以通过同一管道进行交互。(2)命名管道不但可以面向字节流,还可以面向消息,所以读取进程可以读取写进程发送的不同长度的消息。(3)多个独立的管道实例可以用一个名称来命名。例如几个客户端可以使用名称相同的管

2、道与同一个服务器进行并发通信。(4)命名管道可以用于网络间两个进程的通信,而其实现的过程与本地进程通信完全一致。实验目标:在客户端输入数据a和b,然后发送到服务器并计算a+b,然后把计算结果发送到客户端。可以多个客户端与同一个服务器并行通信。界面设计:难点所在:实现的过程比较简单,但有一个难点。原本当服务端使用ConnectNamedPipe函数后,如果有客户端连接,就可以直接进行交互。原来我在实现过程中,当管道空闲时,管道的线程函数会无限(INFINITE)阻塞。若现在需要停止服务,就必须结束所有的线程,TernimateT

3、hread可以作为一个结束线程的方法,但我基本不用这个函数。一旦使用这个函数之后,目标线程就会立即结束,但如果此时的目标线程正在操作互斥资源、内核调用、或者是操作共享DLL的全局变量,可能会出现互斥资源无法释放、内核异常等现象。这里我用重叠I/0来解决这个问题,在创建PIPE时使用FILE_FLAG_OVERLAPPED标志,这样使用ConnectNamedPipe后会立即返回,但线程的阻塞由等待函数WaitForSingleObject来实现,等待OVERLAPPED结构的事件对象被设置。客户端主要代码:代码:voidCMy

4、Dlg::OnSubmit(){//打开管道HANDLEhPipe=CreateFile("\\.\Pipe\NamedPipe",GENERIC_READ

5、GENERIC_WRITE,,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hPipe==INVALID_HANDLE_VALUE){this->MessageBox("打开管道失败,服务器尚未启动,或者客户端数量过多");return;}DWORDnReadByte,nWriteByte;charszBu

6、f[1024]={0};//把两个整数(a,b)格式化为字符串sprintf(szBuf,"%d%d",this->nFirst,this->nSecond);//把数据写入管道WriteFile(hPipe,szBuf,strlen(szBuf),&nWriteByte,NULL);memset(szBuf,0,sizeof(szBuf));//读取服务器的反馈信息ReadFile(hPipe,szBuf,1024,&nReadByte,NULL);//把返回信息格式化为整数sscanf(szBuf,"%d",&(this-

7、>nResValue));this->UpdateData(false);CloseHandle(hPipe);}服务端主要代码:代码://启动服务voidCMyDlg::OnStart(){CStringlpPipeName="\\.\Pipe\NamedPipe";for(UINTi=0;i

8、FILE_FLAG_OVERLAPPED,PIPE_

9、TYPE_BYTE

10、PIPE_READMODE_BYTE

11、PIPE_WAIT,nMaxConn,0,0,1000,NULL);if(PipeInst[i].hPipe==INVALID_HANDLE_VALUE){DWORDdwErrorCode=GetLastError();this->MessageBox("创建管道错误!");return;}//为每个管道实例创建一个事件对象,用于实现重叠IOPipeInst[i].hEvent=CreateEvent(NULL,false,false,false);//为每个管道实例分

12、配一个线程,用于响应客户端的请求PipeInst[i].hTread=AfxBeginThread(ServerThread,&PipeInst[i],THREAD_PRIORITY_NORMAL);}this->SetWindowText("命名管道实例之服务器(运行)")

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。