C使用Windows命名管道

前端之家收集整理的这篇文章主要介绍了C使用Windows命名管道前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
由于某些原因,桅杆和奴隶都失败了,但是我可以找到关于它们如何工作的任何好例子,所以我不知道我哪里出错了.

主服务器在ConnectNamedPipe之后永远不会退出WaitForSingleObject,并且从服务器在第一个boost :: asio :: read调用中抛出异常,“等待进程打开管道的另一端”,我虽然WaitNamedPipe的意思是等待主人中的ConnectNamedPipe?

master.cpp

  1. asio::io_service ioservice;
  2. asio::windows::stream_handle in(ioservice);
  3. int main()
  4. {
  5. HANDLE pipe = INVALID_HANDLE_VALUE;
  6. try
  7. {
  8. //create pipe
  9. pipe = CreateNamedPipe("\\\\.\\pipe\\FLTest",PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,255,50000,0);
  10. if(pipe == INVALID_HANDLE_VALUE)
  11. {
  12. printWinError();
  13. return -1;
  14. }
  15. in.assign(pipe);
  16. std::cout << "Created pipe" << std::endl;
  17. //spawn child
  18. STARTUPINFO startInfo;
  19. ZeroMemory(&startInfo,sizeof(STARTUPINFO));
  20. startInfo.cb = sizeof(STARTUPINFO);
  21. PROCESS_INFORMATION procInfo;
  22. ZeroMemory(&procInfo,sizeof(PROCESS_INFORMATION));
  23. if(CreateProcess(0,"slave.exe",FALSE,CREATE_NEW_CONSOLE,&startInfo,&procInfo))
  24. {
  25. std::cout << "Slave process created" << std::endl;
  26. }
  27. else
  28. {
  29. printWinError();
  30. DisconnectNamedPipe(pipe);
  31. return -1;
  32. }
  33.  
  34. OVERLAPPED overlapped = {0};
  35. overlapped.hEvent = CreateEvent(0,TRUE,0);
  36. if(ConnectNamedPipe(pipe,&overlapped) == FALSE)
  37. {
  38. unsigned error = GetLastError();
  39. if(error != ERROR_PIPE_CONNECTED &&
  40. error != ERROR_IO_PENDING)
  41. {
  42. printWinError();
  43. DisconnectNamedPipe(pipe);
  44. return -1;
  45. }
  46. }
  47. WaitForSingleObject(overlapped.hEvent,INFINITE);
  48. CloseHandle(overlapped.hEvent);
  49. std::cout << "Pipe connected" << std::endl;
  50.  
  51. for(int i = 0; i < 100; ++i)
  52. {
  53. boost::system::error_code error;
  54. unsigned n = i * 5;
  55. asio::write(in,asio::buffer((char*)&n,sizeof(unsigned)),asio::transfer_all(),error);
  56. if(error)throw boost::system::system_error(error);
  57. }
  58. std::cout << "Sent data" << std::endl;
  59.  
  60. FlushFileBuffers(pipe);
  61. DisconnectNamedPipe(pipe);
  62. system("pause");
  63. return 0;
  64. }
  65. catch(const std::exception &e)
  66. {
  67. std::cout << e.what() << std::endl;
  68. if(pipe != INVALID_HANDLE_VALUE)
  69. DisconnectNamedPipe(pipe);
  70. system("pause");
  71. return -1;
  72. }
  73. }

slave.cpp

  1. asio::io_service ioservice;
  2. asio::windows::stream_handle in(ioservice);
  3. int main()
  4. {
  5. try
  6. {
  7. WaitNamedPipe("\\\\.\\pipe\\FLTest",NMPWAIT_WAIT_FOREVER);
  8.  
  9. std::cout << "Pipe avaible" << std::endl;
  10. HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\FLTest",PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0);
  11. if(pipe == INVALID_HANDLE_VALUE)
  12. {
  13. printWinError();
  14. return -1;
  15. }
  16.  
  17. in.assign(pipe);
  18. std::cout << "Pipe connected" << std::endl;
  19.  
  20. for(int i = 0; i < 100; ++i)
  21. {
  22. std::cout << "i: " << i << std::endl;
  23. boost::system::error_code error;
  24. unsigned n;
  25. asio::read(in,error);
  26. if(error)throw boost::system::system_error(error);
  27. }
  28. system("pause");
  29. return 0;
  30. }
  31. catch(const std::exception &e)
  32. {
  33. std::cout << e.what() << std::endl;
  34. system("pause");
  35. return -1;
  36. }
  37. }

显然我有一些完全错误,但我在网上找不到任何东西来比较我的代码.

解决方法

在您的奴隶中,您需要调用CreateFile()来打开管道,而不是CreateNamedPipe.
  1. HANDLE pipe = CreateFile("\\\\.\\pipe\\FLTest",GENERIC_READ | GENERIC_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL
  2. );

猜你在找的C&C++相关文章