windows下使用重叠IO(OVERLAPPE)命名管道服务端

一个命名管道服务端的代码例子:

 

void CreateMyPipe() { char recvMsg[1000] = {0}; char sendMsg[1000] = {0}; DWORD uBufferToRead = 0, uBufferToWrite = 0; BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH]; SECURITY_ATTRIBUTES sa; //安全熟悉符,在WIN NT6系统上是必需的 sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = &sd; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, TRUE, (PACL) 0, FALSE); //创建有名管道,管道名以//./pipe/namedpipe的方式 //PIPE_ACCESS_DUPLEX 允许双功,既可以双向同时操作 //FILE_FLAG_OVERLAPPED 允许异步IO,即重叠方式 hPipe = CreateNamedPipe(L"////.//pipe//namedpipe", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, 1, 1024, 1024, 0, &sa); if ( INVALID_HANDLE_VALUE == hPipe ) { return ; } hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 创建一个事件 if (INVALID_HANDLE_VALUE == hEvent) { return; } OVERLAPPED ovlap; ZeroMemory(&ovlap, sizeof(OVERLAPPED)); ovlap.hEvent = hEvent; //将一个事件与重叠IO绑定 while(bRunning) { /* 等待客户连接 , 采用了重叠方式, 该函数会立即返回不会阻塞*/ if (!ConnectNamedPipe(hPipe, &ovlap)) { TRACE(L"开始监听");; /* 由于函数会立即返回,所以在没有连接的时候不会阻塞会返回,这个时候要判断错误失败的原因*/ if (ERROR_IO_PENDING != GetLastError()) { break ; //连接失败 } } /* 阻塞状态下,等待管道另一端的连入,当一个连接到来的时候,ovlap.hEvent会立即变为有信号状态 */ if (WAIT_FAILED == WaitForSingleObject(ovlap.hEvent, INFINITE)) { TRACE(L"等待/n"); break ; //等待失败 } while( ReadFile(hPipe, recvMsg, sizeof(recvMsg), &uBufferToRead, NULL) > 0 ) { OutputDebugStringA(recvMsg); //获得信息 recvMsg //对recvMsg处理后,获得sendMsg,将其发送到管道的另一端 memset(sendMsg, 0, sizeof(sendMsg)); sprintf(sendMsg, "for test"); if(WriteFile(hPipe, sendMsg, strlen(sendMsg), &uBufferToWrite, NULL)>0) { TRACE(L"发送成功"); } else { TRACE(L"发送失败"); } } if (!g_bRunning) //g_bRunning全局变量,当程序退出时,为false { CloseHandle(hEvent); CloseHandle(hPipe); } } CloseHandle(hEvent); CloseHandle(hPipe); }

你可能感兴趣的:(windows,IO,Security,null,Descriptor,attributes)