ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:29.55KB ,
资源ID:25763783      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25763783.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用邮槽进行进程通信.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用邮槽进行进程通信.docx

1、使用邮槽进行进程通信基于visual c+之windows核心编程代码分析(16)使用邮槽进行进程通信 分类: VC+编程技术 Visual C+2010编程技术 Visual Studio2012 Windows8 信息安全 2011-12-17 12:12 107人阅读 评论(0) 收藏 举报 在Windows环境下,实现进程间通信的方式有很多种,如套接字、管道、远程过程调用和NETBIOS等,邮槽是其中实现单通道进程间通信的一种。创建邮槽的进程被称为邮槽服务器,而其它发送消息给邮槽的进程被称为邮槽客户端。邮槽客户端能发送消息给本机的邮槽,也可发送消息给局域网内其他计算机内的邮槽,所有这些

2、消息都存储在邮槽内,直到邮槽服务器读取它。这些消息通常是以广播的方式发送,建立在面向无链接的数据报的基础上,因此在线路不好时传输质量不可靠。这种进程间通信的方式比较适用于在局域网环境内传送和接收短消息,也可在局域网内向所有计算机广播消息。用邮槽进行进程间通信主要通过三个步骤来实现:创建邮槽服务器,向邮槽发送消息和从邮槽中读取消息。下面将用Windows的API函数来完成这三个步骤。邮槽的客户端代码实现如下。view plaincopy to clipboardprint?1. /*头文件*/2. #include 3. #include 4. /*全局变量*/5. HANDLEhSlot;6.

3、 LPTSTRlpszSlotName=TEXT(.mailslotsample_mailslot);/mailslot名 7. LPTSTRlpszMessage=TEXT(TestMessageformailslot);/通信的内容 8. 9. /*10. *voidmain()11. *功能进程间mailslot通信客户端12. */13. voidmain()14. 15. BOOLfResult;16. HANDLEhFile;17. DWORDcbWritten;18. 19. DWORDcbMessage;20. /打开mailslot 21. hFile=CreateFile(

4、lpszSlotName,22. GENERIC_WRITE,/可写 23. FILE_SHARE_READ,24. (LPSECURITY_ATTRIBUTES)NULL,25. OPEN_EXISTING,/打开一个已经存在的mailslot,应该由服务端已经创建 26. FILE_ATTRIBUTE_NORMAL,27. (HANDLE)NULL);28. 29. if(hFile=INVALID_HANDLE_VALUE)30. 31. printf(CreateFilefailedwith%d.n,GetLastError();32. return;33. 34. /向mailslo

5、t写入 35. fResult=WriteFile(hFile,36. lpszMessage,37. (DWORD)(lstrlen(lpszMessage)+1)*sizeof(TCHAR),38. &cbWritten,39. (LPOVERLAPPED)NULL);40. 41. if(!fResult)42. 43. printf(WriteFilefailedwith%d.n,GetLastError();44. return;45. 46. /结束 47. printf(Slotwrittentosuccessfully.n);48. CloseHandle(hFile);49.

6、 return;50. 邮槽的服务端代码实现如下。view plaincopy to clipboardprint?1. /*头文件*/2. #include 3. #include 4. /*全局变量*/5. HANDLEhSlot;6. LPTSTRlpszSlotName=TEXT(.mailslotsample_mailslot);7. LPTSTRMessage=TEXT(Messageformailslotinprimarydomain.);8. 9. /*10. *voidmain()11. *功能进程间mailslot通信客户端12. */13. voidmain()14. 1

7、5. DWORDcbMessage,cMessage,cbRead;16. BOOLfResult;17. LPTSTRlpszBuffer;18. TCHARachID80;19. DWORDcAllMessages;20. HANDLEhEvent;21. OVERLAPPEDov;22. 23. cbMessage=cMessage=cbRead=0;24. 25. hSlot=CreateMailslot(26. lpszSlotName,/mailslot名 27. 0,/不限制消息大小 28. MAILSLOT_WAIT_FOREVER,/无超时 29. (LPSECURITY_A

8、TTRIBUTES)NULL);30. 31. if(hSlot=INVALID_HANDLE_VALUE)32. 33. printf(CreateMailslotfailedwith%dn,GetLastError();34. return;35. 36. elseprintf(Mailslotcreatedsuccessfully.n);37. 38. while(1)39. 40. /获取mailslot信息 41. fResult=GetMailslotInfo(hSlot,/mailslot句柄 42. (LPDWORD)NULL,/无最大消息限制 43. &cbMessage,/

9、下一条消息的大小 44. &cMessage,/消息的数量 45. (LPDWORD)NULL);/无时限 46. 47. if(!fResult)48. 49. printf(GetMailslotInfofailedwith%d.n,GetLastError();50. return;51. 52. 53. if(cbMessage=MAILSLOT_NO_MESSAGE)54. 55. /没有消息,过一段时间再去读 56. Sleep(20000);57. continue;58. 59. 60. cAllMessages=cMessage;61. 62. while(cMessage!

10、=0)/获取全部消息,有可能不只一条 63. 64. /提示信息 65. wsprintf(LPTSTR)achID,66. nMessage#%dof%dn,67. cAllMessages-cMessage+1,68. cAllMessages);69. 70. /分配空间 71. lpszBuffer=(LPTSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,72. lstrlen(LPTSTR)achID)*sizeof(TCHAR)+cbMessage);73. if(NULL=lpszBuffer)74. 75. return;76.

11、77. /读取消息 78. fResult=ReadFile(hSlot,/mailslot句柄 79. lpszBuffer,/缓存 80. cbMessage,/消息的长度 81. &cbRead,/实际读取的长度 82. NULL);83. 84. if(!fResult)85. 86. printf(ReadFilefailedwith%d.n,GetLastError();87. GlobalFree(HGLOBAL)lpszBuffer);88. return;89. 90. 91. /处理信息,显示 92. lstrcat(lpszBuffer,(LPTSTR)achID);93

12、. printf(Contentsofthemailslot:%sn,lpszBuffer);94. 95. HeapFree(GetProcessHeap(),0,lpszBuffer);96. /计算剩余的消息数 97. fResult=GetMailslotInfo(hSlot,98. (LPDWORD)NULL,99. &cbMessage,100. &cMessage,101. (LPDWORD)NULL);102. 103. if(!fResult)104. 105. printf(GetMailslotInfofailed(%d)n,GetLastError();106. ret

13、urn;107. 108. 109. 110. return;111. view plaincopy to clipboardprint?1. /*头文件*/2. #include 3. #include 4. /*全局变量*/5. HANDLEhSlot;6. LPTSTRlpszSlotName=TEXT(.mailslotsample_mailslot);7. LPTSTRMessage=TEXT(Messageformailslotinprimarydomain.);8. 9. /*10. *voidmain()11. *功能进程间mailslot通信客户端12. */13. void

14、main()14. 15. DWORDcbMessage,cMessage,cbRead;16. BOOLfResult;17. LPTSTRlpszBuffer;18. TCHARachID80;19. DWORDcAllMessages;20. HANDLEhEvent;21. OVERLAPPEDov;22. 23. cbMessage=cMessage=cbRead=0;24. 25. hSlot=CreateMailslot(26. lpszSlotName,/mailslot名 27. 0,/不限制消息大小 28. MAILSLOT_WAIT_FOREVER,/无超时 29. (L

15、PSECURITY_ATTRIBUTES)NULL);30. 31. if(hSlot=INVALID_HANDLE_VALUE)32. 33. printf(CreateMailslotfailedwith%dn,GetLastError();34. return;35. 36. elseprintf(Mailslotcreatedsuccessfully.n);37. 38. while(1)39. 40. /获取mailslot信息 41. fResult=GetMailslotInfo(hSlot,/mailslot句柄 42. (LPDWORD)NULL,/无最大消息限制 43. &

16、cbMessage,/下一条消息的大小 44. &cMessage,/消息的数量 45. (LPDWORD)NULL);/无时限 46. 47. if(!fResult)48. 49. printf(GetMailslotInfofailedwith%d.n,GetLastError();50. return;51. 52. 53. if(cbMessage=MAILSLOT_NO_MESSAGE)54. 55. /没有消息,过一段时间再去读 56. Sleep(20000);57. continue;58. 59. 60. cAllMessages=cMessage;61. 62. whil

17、e(cMessage!=0)/获取全部消息,有可能不只一条 63. 64. /提示信息 65. wsprintf(LPTSTR)achID,66. nMessage#%dof%dn,67. cAllMessages-cMessage+1,68. cAllMessages);69. 70. /分配空间 71. lpszBuffer=(LPTSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,72. lstrlen(LPTSTR)achID)*sizeof(TCHAR)+cbMessage);73. if(NULL=lpszBuffer)74. 75.

18、return;76. 77. /读取消息 78. fResult=ReadFile(hSlot,/mailslot句柄 79. lpszBuffer,/缓存 80. cbMessage,/消息的长度 81. &cbRead,/实际读取的长度 82. NULL);83. 84. if(!fResult)85. 86. printf(ReadFilefailedwith%d.n,GetLastError();87. GlobalFree(HGLOBAL)lpszBuffer);88. return;89. 90. 91. /处理信息,显示 92. lstrcat(lpszBuffer,(LPTSTR)achID);93. printf(Contentsofthemailslot:%sn,lpszBuffer);94. 95. HeapFree(GetProcessHeap(),0,lpszBuffer);96. /计算剩余的消息数 97. fResult=GetMailslotInfo(hSlot,98. (LPDWORD)NULL,99. &cbMessage,100. &cMessage,101. (LPDWORD)NULL);102. 103. if(!fResult)104. 105. printf(GetMailslotInfofailed(%d)n

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1