[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 }

 

posted @ 2014-04-26 22:11  beautifulzzzz  阅读(1161)  评论(0编辑  收藏  举报