由于某些原因,桅杆和奴隶都失败了,但是我可以找到关于它们如何工作的任何好例子,所以我不知道我哪里出错了.
主服务器在ConnectNamedPipe之后永远不会退出WaitForSingleObject,并且从服务器在第一个boost :: asio :: read调用中抛出异常,“等待进程打开管道的另一端”,我虽然WaitNamedPipe的意思是等待主人中的ConnectNamedPipe?
master.cpp
asio::io_service ioservice; asio::windows::stream_handle in(ioservice); int main() { HANDLE pipe = INVALID_HANDLE_VALUE; try { //create pipe pipe = CreateNamedPipe("\\\\.\\pipe\\FLTest",PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,255,50000,0); if(pipe == INVALID_HANDLE_VALUE) { printWinError(); return -1; } in.assign(pipe); std::cout << "Created pipe" << std::endl; //spawn child STARTUPINFO startInfo; ZeroMemory(&startInfo,sizeof(STARTUPINFO)); startInfo.cb = sizeof(STARTUPINFO); PROCESS_INFORMATION procInfo; ZeroMemory(&procInfo,sizeof(PROCESS_INFORMATION)); if(CreateProcess(0,"slave.exe",FALSE,CREATE_NEW_CONSOLE,&startInfo,&procInfo)) { std::cout << "Slave process created" << std::endl; } else { printWinError(); DisconnectNamedPipe(pipe); return -1; } OVERLAPPED overlapped = {0}; overlapped.hEvent = CreateEvent(0,TRUE,0); if(ConnectNamedPipe(pipe,&overlapped) == FALSE) { unsigned error = GetLastError(); if(error != ERROR_PIPE_CONNECTED && error != ERROR_IO_PENDING) { printWinError(); DisconnectNamedPipe(pipe); return -1; } } WaitForSingleObject(overlapped.hEvent,INFINITE); CloseHandle(overlapped.hEvent); std::cout << "Pipe connected" << std::endl; for(int i = 0; i < 100; ++i) { boost::system::error_code error; unsigned n = i * 5; asio::write(in,asio::buffer((char*)&n,sizeof(unsigned)),asio::transfer_all(),error); if(error)throw boost::system::system_error(error); } std::cout << "Sent data" << std::endl; FlushFileBuffers(pipe); DisconnectNamedPipe(pipe); system("pause"); return 0; } catch(const std::exception &e) { std::cout << e.what() << std::endl; if(pipe != INVALID_HANDLE_VALUE) DisconnectNamedPipe(pipe); system("pause"); return -1; } }
slave.cpp
asio::io_service ioservice; asio::windows::stream_handle in(ioservice); int main() { try { WaitNamedPipe("\\\\.\\pipe\\FLTest",NMPWAIT_WAIT_FOREVER); std::cout << "Pipe avaible" << std::endl; HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\FLTest",PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0); if(pipe == INVALID_HANDLE_VALUE) { printWinError(); return -1; } in.assign(pipe); std::cout << "Pipe connected" << std::endl; for(int i = 0; i < 100; ++i) { std::cout << "i: " << i << std::endl; boost::system::error_code error; unsigned n; asio::read(in,error); if(error)throw boost::system::system_error(error); } system("pause"); return 0; } catch(const std::exception &e) { std::cout << e.what() << std::endl; system("pause"); return -1; } }
解决方法
在您的奴隶中,您需要调用CreateFile()来打开管道,而不是CreateNamedPipe.
HANDLE pipe = CreateFile("\\\\.\\pipe\\FLTest",GENERIC_READ | GENERIC_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL );