NamePipeServer.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "stdafx.h"
  2. #include "NamePipeServer.h"
  3. using namespace std;
  4. void NamePipeServer::CreateNamedPipeInServer()
  5. {
  6. HANDLE hEvent;
  7. OVERLAPPED ovlpd;
  8. BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
  9. SECURITY_ATTRIBUTES sa;
  10. sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  11. sa.bInheritHandle = TRUE;
  12. sa.lpSecurityDescriptor = &sd;
  13. InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
  14. SetSecurityDescriptorDacl(&sd, TRUE, (PACL) 0, FALSE);
  15. //创建命名管道
  16. //这里创建的是双向模式且使用重叠模式(异步操作)的命名管道
  17. hNamedPipe = CreateNamedPipe( _T("\\\\.\\pipe\\testspipe"), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0, 1, 1024, 1024, 0, &sa);
  18. if( INVALID_HANDLE_VALUE == hNamedPipe )
  19. {
  20. cout << GetLastError() << endl;
  21. hNamedPipe = NULL;
  22. cout << "创建命名管道失败!!!" << endl << endl;
  23. return;
  24. }
  25. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  26. if( !hEvent )
  27. {
  28. cout<<"创建事件失败 ..."<< endl<< endl;
  29. return;
  30. }
  31. memset(&ovlpd, 0, sizeof(OVERLAPPED));
  32. ovlpd.hEvent = hEvent;
  33. cout << "等待客户端的连接" << endl;
  34. if( !ConnectNamedPipe(hNamedPipe, &ovlpd) )
  35. {
  36. if( ERROR_IO_PENDING != GetLastError() )
  37. {
  38. CloseHandle(hNamedPipe);
  39. CloseHandle(hEvent);
  40. cout<<"等待客户端连接失败 ..."<< endl << endl;
  41. return;
  42. }
  43. }
  44. //等待事件 hEvent 失败
  45. if( WAIT_FAILED == WaitForSingleObject(hEvent, INFINITE) )
  46. {
  47. CloseHandle(hNamedPipe);
  48. CloseHandle(hEvent);
  49. cout<<"等待对象失败 ..."<<endl<<endl;
  50. return;
  51. }
  52. CloseHandle(hEvent);
  53. }
  54. void NamePipeServer::NamedPipeReadInServer()
  55. {
  56. char * pReadBuf;
  57. DWORD dwRead;
  58. pReadBuf = new char[strlen(pStr) + 1];
  59. memset(pReadBuf, 0, strlen(pStr) + 1);
  60. //从命名管道中读取数据
  61. if( !ReadFile(hNamedPipe, pReadBuf, strlen(pStr), &dwRead, NULL) )
  62. {
  63. delete []pReadBuf;
  64. cout<<"读取数据失败 ..."<< endl<< endl;
  65. return;
  66. }
  67. cout << "读取数据成功::"<< pReadBuf << endl<< endl;
  68. }
  69. void NamePipeServer::NamedPipeWriteInServer()
  70. {
  71. DWORD dwWrite;
  72. //向命名管道中写入数据
  73. if( !WriteFile(hNamedPipe, pStr, strlen(pStr), &dwWrite, NULL) )
  74. {
  75. cout << "写入数据失败 ..." << endl<< endl;
  76. return;
  77. }
  78. cout << "写入数据成功:: "<< pStr<< endl<< endl;
  79. }
  80. int main()
  81. {
  82. NamePipeServer pipeserver;
  83. //创建命名管道
  84. pipeserver.CreateNamedPipeInServer();
  85. //从命名管道读数据
  86. pipeserver.NamedPipeReadInServer();
  87. //向匿名管道中写入数据
  88. pipeserver.NamedPipeWriteInServer();
  89. system("pause");
  90. return 0;
  91. }