欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Windows系统编程之进程间通信.rtf

    • 资源ID:70009215       资源大小:37.60KB        全文页数:5页
    • 资源格式: RTF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Windows系统编程之进程间通信.rtf

    Windows 系统编程之进程间通信 看雪技术论坛 编程开发 Win32/Win64 编程 Windows 系统编程之进程间通信 二、命名管道 命名管道具有以下几个特征:(1)命名管道是双向的,所以两个进程可以通过同一管道进行交互。(2)命名管道不但可以面向字节流,还可以面向消息,所以读取进程可以读取写进程发送的不同长度的消息。(3)多个独立的管道实例可以用一个名称来命名。例如几个客户端可以使用名称相同的管道与同一个服务器进行并发通信。(4)命名管道可以用于网络间两个进程的通信,而其实现的过程与本地进程通信完全一致。实验目标:在客户端输入数据 a 和 b,然后发送到服务器并计算 a+b,然后把计算结果发送到客户端。可以多个客户端与同一个服务器并行通信。界面设计:难点所在:实现的过程比较简单,但有一个难点。原本当服务端使用 ConnectNamedPipe函数后,如果有客户端连接,就可以直接进行交互。原来我在实现过程中,当管道空闲时,管道的线程函数会无限(INFINITE)阻塞。若现在需要停止服务,就必须结束所有的线程,TernimateThread 可以作为一个结束线程的方法,但我基本不用这个函数。一旦使用这个函数之后,目标线程就会立即结束,但如果此时的目标线程正在操作互斥资源、内核调用、或者是操作共享 DLL 的全局变量,可能会出现互斥资源无法释放、内核异常等现象。这里我用重叠 I/0 来解决这个问题,在创建 PIPE 时使用 FILE_FLAG_OVERLAPPED 标志,这样使用ConnectNamedPipe 后会立即返回,但线程的阻塞由等待函数 WaitForSingleObject 来实现,等待 OVERLAPPED 结构的事件对象被设置。客户端主要代码:代码:void CMyDlg:OnSubmit()/打开管道 HANDLE hPipe=CreateFile(.PipeNamedPipe,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hPipe=INVALID_HANDLE_VALUE)this-MessageBox(打开管道失败,服务器尚未启动,或者客户端数量过多);return;DWORD nReadByte,nWriteByte;char szBuf1024=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-nResValue);this-UpdateData(false);CloseHandle(hPipe);服务端主要代码:代码:/启动服务void CMyDlg:OnStart()CString lpPipeName=.PipeNamedPipe;for(UINT i=0;i MessageBox(创建管道错误!);return;/为每个管道实例创建一个事件对象,用于实现重叠 IO PipeInsti.hEvent =CreateEvent(NULL,false,false,false);/为每个管道实例分配一个线程,用于响应客户端的请求 PipeInsti.hTread=AfxBeginThread(ServerThread,&PipeInsti,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 SetWindowText(命名管道实例之服务器);this-MessageBox(停止启动成功);/线程服务函数UINT ServerThread(LPVOID lpParameter)DWORD nReadByte=0,nWriteByte=0,dwByte=0;char szBufMAX_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;HOHO.学完之后提点建议 LPTSTR lpProgram=new char(sizeof(argv1);strcpy(lpProgram,argv1);LPTSTR lpInputFile=new char(sizeof(argv2);strcpy(lpInputFile,argv2);LPTSTR lpOutputFile=new char(sizeof(argv3);strcpy(lpOutputFile,argv3);这段内存没有被释放,另外这个写法好像也有点问题(虽然可以正常运行),不知这样改一下如何:LPTSTR lpProgram=new char sizeof(argv1);strcpy(lpProgram,argv1);LPTSTR lpInputFile=new char sizeof(argv2);strcpy(lpInputFile,argv2);LPTSTR lpOutputFile=new char sizeof(argv3);strcpy(lpOutputFile,argv3);吹毛求疵之举,兄弟不要见怪 我认为应该改成:LPTSTR lpProgram=new char strlen(argv1)+1 ;strcpy(lpProgram,argv1);LPTSTR lpInputFile=new char strlen(argv2)+1 ;strcpy(lpInputFile,argv2);LPTSTR lpOutputFile=new char strlen(argv3)+1 ;strcpy(lpOutputFile,argv3);因为 sizeof(argv1)=4.

    注意事项

    本文(Windows系统编程之进程间通信.rtf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开