77.邮槽通信

服务器端

  • 创建邮槽

    1                                    //名称,数量    等待时间          安全属性
    2     HANDLE hmailslot = CreateMailslotA(MAILSLOT, 0, MAILSLOT_WAIT_FOREVER, NULL);
  • 获取邮槽信息

    1 DWORD dxNextsize = 0;//标识最大的数据大小
    2             DWORD dxmsgcount = 0;//消息数量
    3             DWORD readcount = 0;//读取成功的数量
    4
    5             //获取邮槽信息
    6                                //文件名            标记最大的数据大小          多少条消息    安全属性
    7             if (GetMailslotInfo(hmailslot, NULL,    &dxNextsize,                &dxmsgcount, NULL))
  • 从邮槽读取一个数据

    1                     //    LPBYYE 的类型是 unsigned char *
    2                     //分配内存
    3                     LPBYTE lpbuf = malloc(dxNextsize + 1);
    4                     //读取一行
    5                              //文件名   首地址   大小        读的个数
    6                     ReadFile(hmailslot, lpbuf, dxNextsize, &readcount, NULL);
    7                     printf("\n%s", lpbuf);

、服务端负责显示

服务端完整代码

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<Windows.h>
 4
 5 //定义邮槽
 6 #define MAILSLOT "\\\\.\\mailslot\\cgw"
 7
 8
 9 void main()
10 {
11     //创建邮槽
12                                        //名称,数量    等待时间          安全属性
13     HANDLE hmailslot = CreateMailslotA(MAILSLOT, 0, MAILSLOT_WAIT_FOREVER, NULL);
14     if (hmailslot == NULL)
15     {
16         printf("创建失败");
17     }
18     else
19     {
20
21         while (1)
22         {
23             system("pause");
24             DWORD dxNextsize = 0;//标识最大的数据大小
25             DWORD dxmsgcount = 0;//消息数量
26             DWORD readcount = 0;//读取成功的数量
27
28             //获取邮槽信息
29                                //文件名            标记最大的数据大小          多少条消息    安全属性
30             if (GetMailslotInfo(hmailslot, NULL,    &dxNextsize,                &dxmsgcount, NULL))
31             {
32
33                 for (int i = 0; i < dxmsgcount;i++)
34                 {
35                     //    LPBYYE 的类型是 unsigned char *
36                     //分配内存
37                     LPBYTE lpbuf = malloc(dxNextsize + 1);
38                     //读取一行
39                              //文件名   首地址   大小        读的个数
40                     ReadFile(hmailslot, lpbuf, dxNextsize, &readcount, NULL);
41                     printf("\n%s", lpbuf);
42                 }
43             }
44             else
45             {
46                 printf("error");
47             }
48         }
49     }
50     system("pause");
51 }

客户端

  • 打开邮槽

    1 //第一个名称,第二个写入,第三个共享读,打开已经存在
    2     HANDLE hmailslot = CreateFileA(MAILSLOT, 3         GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  • 向邮槽写入数据

    1 char str[10] = "123456789";
    2         scanf("%s", str);
    3         //转化指针类型
    4         LPBYTE lpmsg = (LPBYTE)str;
    5         int wok = 0;
    6         //写入信息,第一个句柄,第二个写入内存首地址,第三个长度,第四个写入成功保存wok
    7         WriteFile(hmailslot, lpmsg,10,&wok,NULL);
  • 关闭邮槽

    1 CloseHandle(hmailslot);//关闭

客户端完整代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<Windows.h>
 5
 6 #define MAILSLOT "\\\\.\\mailslot\\cgw"
 7
 8 //#define GENERIC_READ                     (0x80000000L)
 9 //#define GENERIC_WRITE                    (0x40000000L)
10 //#define GENERIC_EXECUTE                  (0x20000000L)
11 //#define GENERIC_ALL                      (0x10000000L)
12 void main()
13 {
14
15     //第一个名称,第二个写入,第三个共享读,打开已经存在
16     HANDLE hmailslot = CreateFileA(MAILSLOT, 17         GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
18
19     if (hmailslot ==INVALID_HANDLE_VALUE)
20     {
21         printf("打开失败");
22     }
23     while (1)
24     {
25         char str[10] = "123456789";
26         scanf("%s", str);
27         //转化指针类型
28         LPBYTE lpmsg = (LPBYTE)str;
29         int wok = 0;
30         //写入信息,第一个句柄,第二个写入内存首地址,第三个长度,第四个写入成功保存wok
31         WriteFile(hmailslot, lpmsg,10,&wok,NULL);
32
33     }
34     CloseHandle(hmailslot);//关闭
35
36     system("pause");
37 }

原文地址:https://www.cnblogs.com/xiaochi/p/8455180.html

时间: 2024-10-14 09:35:27

77.邮槽通信的相关文章

两个程序之间的通行(邮槽)

*Windows环境下,实现进程间的通信方式消息.命名管道(Name Pipes).剪贴板(ClipBoard)等,邮槽(MailSlot)也是其中一种. 1.邮槽 邮槽(Mailslot)也称为邮件槽,它是 Windows 提供的一种用来实现进程间通信的手段,是单向数据传输的服务. 邮槽的弊端:邮槽是单向通信.服务器端只能读取,客户端只能写入.如果要双向通信就需要服务端写一个邮槽,客户端在写一个邮槽.创建两个邮槽. 服务端和客户端的区分:创建邮槽的为服务端,已存在的邮槽的哪一端. 客户端在使用

邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系统所需要编写的代码非常少.如果读者是项目经理,就可以给你手下每一位员工的机器上安装上这个系统中的邮槽服务器端程序,在你自己的机器上安装油槽的客户端程序,这样,当你想通知员工开会,就可以通过自己安装的邮槽客户端程序.将开会这个消息发送出去,因为机器上都安装了邮槽服务器端的程序,所以他们都能同时收到你发

进程间的通信——邮槽与命名管道d

进程间的通信是指在系统中两个或多个进程之间通过第三方进行数据共享. 1.邮槽. 邮槽是window系统提供的一种单向通信的机制.即进程中的一方只能写入或者读取数据,而另一方则只能读取或写入数据.通过邮槽,可以实现一对多或跨网络的进程之间的通信.但邮槽传输的数据量非常小,一般只有400KB左右. 邮槽创建函数CreateMailslot,函数原型: HANDLE CreateMailslot( LPCTSTR lpName, // mailslot name DWORD nMaxMessageSi

【IPC进程间通讯之一】邮槽MailSlot

IPC进程间通信+邮槽MailSlot         IPC(Inter-Process Communication,进程间通信).        现代计算机采用虚拟内存机制,为进程提供独立的足够大的地址空间,处于安全目的,一个进程不具有特殊的权限,是无法访问另一个进程的内存空间,进程间相互隔绝.进程间通信IPC就需要特别的机制来实现,邮槽MailSlot是常用的IPC方法之一.                 1.邮槽(MailSlot):                 邮槽MailSlo

c++下使用邮槽实现进程间通信

Windows API提供了邮槽和命名管道两种机制来实现进程间通信,在这里使用C++实现邮槽. 邮槽是Windows提供的一种进程间单向通信的机制,进程中的一方只能读取(或写入)数据,而另一方只能写入(或读取)数据.这种进程间的通信可以发生在本地或者网络之中.而在使用邮槽之前,服务器端必须先创建邮槽,创建的函数原型如下: 1 HANDLE WINAPI CreateMailslot( 2 _In_ LPCTSTR lpName, 3 _In_ DWORD nMaxMessageSize, 4 _

QT子线程与主线程的信号槽通信

最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽通信的方式,但是并不完全适合线程间的信号槽通信,这主要体现在自定义消息的传递上. 首先我们看看一般的方式: testthread.h 文件 #ifndef TESTTHREAD_H #define TESTTHREAD_H #include <QThread> #include "ms

windows 邮槽mailslot 在服务程序内建立后客户端无权限访问(GetLastError() == 5)的问题

邮槽创建在服务程序内,可以创建成功, 但外部客户端连接时 m_hMailslot = CreateFile("\\\\.\\mailslot\\zdpMailslot",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);GetLastError返回错误 5 ,无权限访问Access Denied 如果路径改为 \\\\*\\mailslot\\zdpMailslot \\\\comp

转载:pyqt线程间通过 信号/槽 通信

转自:http://blog.sina.com.cn/s/blog_613d5bb701016qzv.html 信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实信号槽类似于.NET里面的委托.事件,比如Repeater控件类,当行数据绑定后,触发一个ItemDataBound事件,不管使用者使用会监听该事件并做额外处理,其控件类内部都会触发该事件,这种机制很多程度提高了类的封装性和完整性. PyQt的窗体控件

[转]QT子线程与主线程的信号槽通信-亲测可用!

近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽通信的方式,但是并不完全适合线程间的信号槽通信,这主要体现在自定义消息的传递上. 首先我们看看一般的方式:利用信号-槽发送Qt内置的元数据类型testthread.h 文件 #ifndef TESTTHREAD_H #define TESTTHREAD_H #include <QThread> #