Mailslot,利用邮槽实现进程间通信

使用邮槽通信的进程分为服务端和客户端.

邮槽由服务端创建,在创建时需要指定邮槽名,创建后服务端得到邮槽的句柄.
在邮槽创建后,客户端可以通过邮槽名打开邮槽,在获得句柄后可以向邮槽写入消息.

邮槽通信是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入消息.
消息是先入先出的,客户端先写入的消息在服务端先被读取.

邮槽除了在本机内进行进程间通信外,在主机间也可以通信.
但是在主机间进行邮槽通信,数据通过网络传播时使用的是数据报协议(UDP),所以是一种不可靠的通信.

Note:须包含头文件 #include <windows.h>

//---------------------------------------------------------
//一、服务器端
//---------------------------------------------------------
// 1.1创建邮槽
HANDLE hSlot;
LPCTSTR lpszSlotName = TEXT("\\\\.\\mailslot\\sample_mailslot");
hSlot = CreateMailslot(lpszSlotName, 
                       0,                             // no maximum message size 
                       MAILSLOT_WAIT_FOREVER,         // no time-out for operations 
                       (LPSECURITY_ATTRIBUTES) NULL); // default security
if (hSlot == INVALID_HANDLE_VALUE) 
{
    // CreateMailslot failed.To get extended error information, call GetLastError().
    ......
}
else
{
    // CreateMailslot successfully.
    ......
}

// 1.2读取邮槽信息
DWORD dwMaxMsgSize, dwNextMsgSize, dwMsgCnt, dwReadTimeOut;
BOOL bResult;
bResult = GetMailslotInfo(hSlot, &dwMaxMsgSize, &dwNextMsgSize, &dwMsgCnt, &dwReadTimeOut);
if (bResult)
{
    // GetMailslotInfo successfully.
    ......
}
else
{
    // GetMailslotInfo failed.To get extended error information, call GetLastError().
    ......
}

if (dwNextMsgSize == MAILSLOT_NO_MESSAGE)   // There is no next message.
{
    ......
}
// 一般会循环读取消息
// while (1)
// { 
//      ......
//      if (dwNextMsgSize == MAILSLOT_NO_MESSAGE)
//      {
//          Sleep(...);
//          continue;
//      }
//      ......
// }

// 1.3读取邮槽消息
DWORD dwBytesRead;
TCHAR *lpszBuffer = new TCHAR[dwNextMsgSize/sizeof(TCHAR) + 1];
memset(lpszBuffer, 0, sizeof(TCHAR) * (lstrlen(lpszBuffer)+1));
bResult = ReadFile(hSlot, lpszBuffer, dwNextMsgSize, &dwBytesRead, NULL);
if (!bResult)
{
        // ReadFile failed.To get extended error information, call GetLastError().
        ......
}

// 1.4不需要邮槽时,关闭邮槽,服务器端关闭,则客户端也将不可使用
CloseHandle(hSlot);

//---------------------------------------------------------
//一、客户端
//---------------------------------------------------------
LPTSTR lpszSlotName = TEXT("\\\\.\\mailslot\\sample_mailslot");
LPTSTR lpszMsg = TEXT("Beijing 2008");
HANDLE hFile;
hFile = CreateFile(lpszSlotName, 
                   GENERIC_WRITE,
                   FILE_SHARE_READ,
                   NULL, 
                   OPEN_EXISTING, 
                   FILE_ATTRIBUTE_NORMAL, 
                   NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
    // CreateFile failed.To get extended error information, call GetLastError().
    ......
}


// 写消息
DWORD dwWritten;
BOOL bRet = WriteFile(hFile, 
                      lpszMsg, 
                      (lstrlen(lpszMsg)+1)*sizeof(TCHAR), 
                      &dwWritten,
                      NULL);
if (!bRet)
{
    // WriteFile failed.To get extended error information, call GetLastError().
    ......
}

// 关闭邮槽
CloseHandle(hFile);     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值