Fork me on GitHub

命名管道跨进程通讯

客户端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 
#include <ctime> 
   
int main(int argc, _TCHAR* argv[]) 
    srand(time(NULL)); 
   
    DWORD wlen = 0; 
    Sleep(1000);//等待pipe的创建成功! 
   
    BOOL bRet = WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER); 
   
    if (!bRet) 
    
        printf("connect the namedPipe failed!\n"); 
        return 0; 
    
   
    HANDLE hPipe = CreateFile(          //管道属于一种特殊的文件 
        TEXT("\\\\.\\Pipe\\mypipe"),    //创建的文件名 
        GENERIC_READ | GENERIC_WRITE,   //文件模式 
        0,                              //是否共享 
        NULL,                           //指向一个SECURITY_ATTRIBUTES结构的指针 
        OPEN_EXISTING,                  //创建参数 
        FILE_ATTRIBUTE_NORMAL,          //文件属性(隐藏,只读)NORMAL为默认属性 
        NULL);                          //模板创建文件的句柄 
   
    if (INVALID_HANDLE_VALUE == hPipe) 
    
        printf("open the exit pipe failed!\n"); 
    
    else 
    
        while(true
        
            char buf[256] = ""
            sprintf(buf,"%s%d",buf,rand()%1000); 
            if(WriteFile(hPipe,buf,sizeof(buf),&wlen,0)==FALSE) //向服务器发送内容 
            
                printf("write to pipe failed!\n"); 
                break
            
            else 
            
                printf("To Server: data = %s, size = %d\n", buf, wlen); 
                char rbuf[256] = ""
                DWORD rlen = 0; 
                ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0);  //接受服务发送过来的内容 
                printf("From Server: data = %s, size = %d\n", rbuf, rlen); 
            
            Sleep(1000); 
        
        CloseHandle(hPipe);//关闭管道 
    
   
    system("pause"); 
    return 0; 

服务端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 
#include <ctime> 
   
int main(int argc, _TCHAR* argv[]) 
    srand(time(NULL)); 
   
    char buf[256] = ""
    DWORD rlen = 0; 
    HANDLE hPipe = CreateNamedPipe( 
        TEXT("\\\\.\\Pipe\\mypipe"),                        //管道名 
        PIPE_ACCESS_DUPLEX,                                 //管道类型  
        PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,  //管道参数 
        PIPE_UNLIMITED_INSTANCES,                           //管道能创建的最大实例数量 
        0,                                                  //输出缓冲区长度 0表示默认 
        0,                                                  //输入缓冲区长度 0表示默认 
        NMPWAIT_WAIT_FOREVER,                               //超时时间 
        NULL);                                              //指定一个SECURITY_ATTRIBUTES结构,或者传递零值 
   
    if (INVALID_HANDLE_VALUE == hPipe) 
    
        printf("Create Pipe Error(%d)\n",GetLastError()); 
    
    else 
    
        printf("Waiting For Client Connection...\n"); 
   
        if(!ConnectNamedPipe(hPipe, NULL))  //阻塞等待客户端连接。 
        
            printf("Connection failed!\n"); 
        
        else 
        
            printf("Connection Success!\n"); 
        
   
        while (true
        
            if(!ReadFile(hPipe,buf,256,&rlen,NULL)) //接受客户端发送过来的内容 
            {            
                printf("Read Data From Pipe Failed!\n"); 
                break
            
            else 
            
                printf("From Client: data = %s, size = %d\n", buf, rlen); 
                   
                char wbuf[256] = ""
                sprintf(wbuf, "%s%d", wbuf, rand()%1000); 
                DWORD wlen = 0; 
                WriteFile(hPipe, wbuf, sizeof(wbuf), &wlen, 0); //向客户端发送内容 
                printf("To Client: data = %s, size = %d\n", wbuf, wlen); 
                Sleep(1000); 
            
        
        FlushFileBuffers(hPipe);  
        DisconnectNamedPipe(hPipe);  
        CloseHandle(hPipe);//关闭管道 
    
   
    system("pause"); 
    return 0; 

 下篇,写下C# Name Pipe 跨进程通信

posted @   Jackbase  阅读(541)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示