[C++] socket -8 [命名管道]
::命名管道不但能实现同一台机器上两个进程通信,还能在网络中不同机器上的两个进程之间的通信机制。与邮槽不同,命名管道是采用基于连接并且可靠的传输方式,所以命名管道传输数据只能一对一进行传输。
1 /* 2 命名管道服务器 3 */ 4 #include<windows.h> 5 #include<stdio.h> 6 int main() 7 { 8 HANDLE hpip;//定义命名管道句柄 9 OVERLAPPED ovi={0};//定义结构体变量 10 char buf[200];//定义数据缓冲区 11 DWORD readbuf;//获取实际读取字节数 12 hpip=CreateNamedPipe("\\\\.\\pipe\\pipename",PIPE_ACCESS_DUPLEX, 13 PIPE_TYPE_BYTE,PIPE_UNLIMITED_INSTANCES,1024,1024,0,NULL);//创建命名管道 14 printf("创建管道成功,正在等待客户端连接!\r\n"); 15 if(::ConnectNamedPipe(hpip,&ovi))//等待客户端的连接请求 16 { 17 printf("客户端连接成功\r\n"); 18 printf("正在读取数据!\r\n"); 19 if(ReadFile(hpip,buf,200,&readbuf,NULL))//读取管道数据 20 { 21 printf("读取数据成功!\r\n"); 22 printf("读取数据是: %s\r\n",buf); 23 } 24 else 25 { 26 printf("读取数据失败\r\n"); 27 } 28 } 29 ::Sleep(10000); 30 return 0; 31 }
1 /* 2 命名管道客户端 3 */ 4 #include<windows.h> 5 #include<stdio.h> 6 int main() 7 { 8 HANDLE hpip; 9 OVERLAPPED ovi={0}; 10 char buf[]="命名管道测试程序!\r\n";//定义数据缓冲区 11 DWORD readbuf;//定义结构体变量 12 printf("正在连接命名管道!\r\n"); 13 if(WaitNamedPipe("\\\\.\\pipe\\pipename",NMPWAIT_WAIT_FOREVER))//连接命名管道 14 { 15 hpip=CreateFile("\\\\.\\pipe\\pipename",GENERIC_READ|GENERIC_WRITE,0, 16 NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//打开指定命名管道 17 if(hpip==INVALID_HANDLE_VALUE) 18 { 19 printf("打开命名管道失败\r\n"); 20 } 21 else 22 { 23 if(WriteFile(hpip,buf,sizeof(buf),&readbuf,NULL))//写入数据到管道 24 { 25 printf("数据写入成功!\r\n"); 26 } 27 else 28 { 29 printf("数据写入失败\r\n"); 30 } 31 } 32 } 33 else 34 { 35 printf("管道创建失败!\r\n"); 36 } 37 ::Sleep(10000); 38 return 0; 39 }