邮槽通信的进程分为服务端和客户端.服务端创建邮槽,客户端通过邮槽名打开邮槽,获得句柄后可以向邮槽写数据. 邮槽通信是单向通信,只能由客户端向服务端发送数据.下面来看看有关邮槽的几个API

HANDLE WINAPICreateMailslot(

_In_      LPCTSTR lpName,

_In_      DWORDnMaxMessageSize,

_In_      DWORDlReadTimeout,

_In_opt_  LPSECURITY_ATTRIBUTESlpSecurityAttributes

);

功能:创建一个邮槽

参数:  lpName   指定的邮槽名,格式必须为  \\.\mailslot\[path]name

nMaxMessageSize  可以写到邮槽中的单个消息的最大字节数,如果为0则表示可以是任意大小的消息.

lReadTimeout    读取操作可以等待多久,0表示没有可读的消息则直接返回, MAILSLOT_WAIT_FOREVER表示一直等待可读消息.

lpSecurityAttributes  安全属性结构体指针,   可以为NULL

返回值: 如果成功,返回邮槽句柄,服务端通过句柄操作邮槽.如果失败则返回INVALID_HANDLE_VALUE

BOOL WINAPI GetMailslotInfo(
  _In_       HANDLE hMailslot,
  _Out_opt_  LPDWORD lpMaxMessageSize,
  _Out_opt_  LPDWORD lpNextSize,
  _Out_opt_  LPDWORD lpMessageCount,
  _Out_opt_  LPDWORD lpReadTimeout
);

功能:获取有关邮槽的信息

参数: hMailslot  邮槽句柄

lpMaxMessageSize     单个消息的最大字节数, 也可以为NULL

lpNextSize   下一个消息的大小,可以为NULL,为MAILSLOT_NO_MESSAGE表示没有下一个消息

lpMessageCount  等待读取的消息数, 可以为NULL,

lpReadTimeout   等待可读消息的时间, 也可以为NULL

返回值:成功返回非0,失败返回0

BOOL WINAPI SetMailslotInfo(
  _In_  HANDLE hMailslot,
  _In_  DWORD lReadTimeout
);
 

功能:设置等待可读消息的超时时间

服务端通过ReadFile从邮槽中读取数据,客户端通过CreateFile打开邮槽,WriteFile向邮槽写数据。以下是我用Qt做的简单验证程序,由于不熟悉window窗台程序,所以只能用Qt了。

客户端代码

MailSlotClient::MailSlotClient(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
m_pMailSlotNameLbl = new QLabel(tr("MailSlot Name:"),this);
m_pMailSlotNameLEdit = new QLineEdit(this);
m_pMessageText = new QTextEdit(this);
m_pMainLayout = new QGridLayout(this);
m_pSendMessageBtn = new QPushButton(tr("Send Message "),this);
this->setLayout(m_pMainLayout);
m_pMainLayout->addWidget(m_pMailSlotNameLbl,0,0,1,1);
m_pMainLayout->addWidget(m_pMailSlotNameLEdit,0,1,1,1);
m_pMainLayout->addWidget(m_pSendMessageBtn,0,2,1,1);
m_pMainLayout->addWidget(m_pMessageText,1,0,4,4);
connect(m_pSendMessageBtn,SIGNAL(clicked()),this,SLOT(SendMessageSlot()));
//ui.setupUi(this);
} MailSlotClient::~MailSlotClient()
{ } void MailSlotClient::SendMessageSlot()
{
QString name = m_pMailSlotNameLEdit->text();
string szMailSlotName = (string("\\\\.\\mailslot\\") + name.toStdString()).c_str();
//LPSTR szMailSlotName = "\\\\.\\mailslot\\simplemailslot";
HANDLE hFile ;
hFile = CreateFile(szMailSlotName.c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
QMessageBox::information(this,tr("提示"),tr("打开邮槽失败!"),QMessageBox::Ok);
return ;
}
DWORD dwWriteSize;
string message = m_pMessageText->toPlainText().toStdString();
WriteFile(hFile,message.c_str(),message.size(),&dwWriteSize,NULL);
CloseHandle(hFile);
}

服务端代码:

MailSlotServer::MailSlotServer(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
m_pMailSlotNameLbl = new QLabel(tr("MailSlot Name:"),this);
m_pMailSlotNameLEdit = new QLineEdit(this);
m_pMessageText = new QTextEdit(this);
m_pMainLayout = new QGridLayout(this);
m_pCreateMailSlotBtn = new QPushButton(tr("Create MailSlot "),this);
this->setLayout(m_pMainLayout);
m_pMainLayout->addWidget(m_pMailSlotNameLbl,0,0,1,1);
m_pMainLayout->addWidget(m_pMailSlotNameLEdit,0,1,1,1);
m_pMainLayout->addWidget(m_pCreateMailSlotBtn,0,2,1,1);
m_pMainLayout->addWidget(m_pMessageText,1,0,4,4);
connect(m_pCreateMailSlotBtn,SIGNAL(clicked()),this,SLOT(CreateMailSlot()));
} MailSlotServer::~MailSlotServer()
{ } void MailSlotServer::CreateMailSlot()
{
HANDLE hMailSlot;
QString name = m_pMailSlotNameLEdit->text();
string szMailSlotName = (string("\\\\.\\mailslot\\") + name.toStdString()).c_str();
hMailSlot = CreateMailslot(szMailSlotName.c_str() ,0,MAILSLOT_WAIT_FOREVER,NULL); if (hMailSlot == INVALID_HANDLE_VALUE)
{
QMessageBox::information(this,tr("提示"),tr("创建邮槽失败!"),QMessageBox::Ok);
return ;
} DWORD dwMessageCount = 0;
DWORD dwMessageSize = 0;
DWORD dwReadSize = 0;
bool bFinish =false;
while (TRUE)
{
BOOL bResult = GetMailslotInfo(hMailSlot,NULL,&dwMessageSize,&dwMessageCount,NULL);
if (!bResult)
{
QMessageBox::information(this,tr("提示"),tr("获取邮槽信息失败!"),QMessageBox::Ok);
return ;
}
while (dwMessageCount != 0)
{
char *lpBuffer = new char[dwMessageSize];
memset(lpBuffer,0,dwMessageSize);
ReadFile(hMailSlot,lpBuffer,dwMessageSize,&dwReadSize,NULL); m_pMessageText->setText(QString::fromStdString(lpBuffer));
GetMailslotInfo(hMailSlot,NULL,&dwMessageSize,&dwMessageCount,NULL);
bFinish = true;
}
if (bFinish) //读取完了就返回,不然一直卡住就没法显示接收到的数据了 {
return;
}
}
}

先启动服务端,输入邮槽名,创建邮槽,程序循环等待客户端发来数据。接收到数据后显示。再启动客户端,输入邮槽名,输入要发送的数据,点击发送,数据将显示在服务端。

window API一天一练之邮槽的更多相关文章

  1. 【IPC进程间通讯之中的一个】邮槽MailSlot

    IPC进程间通信+邮槽MailSlot                IPC(Inter-Process Communication.进程间通信).        现代计算机採用虚拟内存机制,为进程提 ...

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

    Windows API提供了邮槽和命名管道两种机制来实现进程间通信,在这里使用C++实现邮槽. 邮槽是Windows提供的一种进程间单向通信的机制,进程中的一方只能读取(或写入)数据,而另一方只能写入 ...

  3. Windows网络编程笔记3 ---- 邮槽和命名管道

    邮槽和命名管道的使用方法也很简单,只需几个有限的函数就可以实现双方的通信. 第三.邮槽 邮槽----进程间通信机制. 通过邮槽客户进程可以将消息通过广播给一个或多个服务进程.这是一个单向通信机制,缺点 ...

  4. [C++] socket -7 [邮槽]

    ::利用邮槽实现windons进程通信 ::一般情况下CreateMailslot()常被使用在进程通信的服务器上,在客户端则是用函数CreateFile()打开指定的邮槽之后进行相关的操作. ::将 ...

  5. [Win]进程间通信——邮槽Mailslot

    进程间通信 进程的地址空间是私有的.出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义.但是在一些具体的应用情况下需要多个进行相互配合 ...

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

    邮槽创建在服务程序内,可以创建成功, 但外部客户端连接时 m_hMailslot = CreateFile("\\\\.\\mailslot\\zdpMailslot",GENER ...

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

    邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系 ...

  8. ASP.NET MVC的Web Api的实练

    学习ASP.NET MVC一年多来,现在该学学Web Api了.API与ASP.NET MVC的Controller差不多.前者只是返回数据序列化和发送给客户端: 后者返回View或Render Vi ...

  9. C#:通过Window API接口实现WiFi

    1.获取Mac地址 //WiFi通知回调 private WlanApi.WLAN_NOTIFICATION_CALLBACK _notificationCallback; this._notific ...

随机推荐

  1. ubuntu18.04初始化配置

    目录 ubuntu18.04初始化配置 ifconfig sshd smb other vim 配置 最后 ubuntu18.04初始化配置 虚拟机挂了, 又得重新安装配置一遍, 这里记录了我几乎每次 ...

  2. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  3. rabbitmq学习(一) —— 安装篇

    安装篇之windows: 略(楼主在windows上安装基本就是按部就班的没遇到什么坑) 安装篇值centos7: 主要记录下centos7下的安装,因为在该系统下安装稍微折腾了下 参考https:/ ...

  4. 玩转SpringCloud Spring Cloud 微服务

    Spring Cloud 简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  5. Java Object part1

    java中Object是所有类的父类,这句话就不多做解释.但是Object中到底有哪些我们常用的方法呢? 1. public native int hashCode();     这个方法是一个nat ...

  6. iOS 11开发教程(十四)iOS11应用代码添加视图

    iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对 ...

  7. POJ1274 The Perfect Stall[二分图最大匹配 Hungary]【学习笔记】

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23911   Accepted: 106 ...

  8. Xtreme8.0 - Kabloom 动态规划

    Xtreme8.0 - Kabloom 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/kablo ...

  9. Linux/CentOS实现交换机-简单的交换机实现

    个人理解: 1.交换机的核心在于Mac地址学习,使其能在全双工/半双工下进行转发工作. 2.对于专业的交换机来说,使用的是专业的网络芯片并自己实现里面的协议,比如说华为的,为什么能卖那么贵,贵在于网络 ...

  10. 阿里云VPC默认网关问题

    在使用VPC专用网络时,阿里云上面不用设置网关都可以工作,其实不是的,狗日的阿里云居然把默认网关设置成了253,比如设置了172.18.0.0/24时,那么它的默认网关就是172.18.0.253.