使用邮槽通信的进程分为服务端和客户端.
邮槽由服务端创建,在创建时需要指定邮槽名,创建后服务端得到邮槽的句柄.
在邮槽创建后,客户端可以通过邮槽名打开邮槽,在获得句柄后可以向邮槽写入消息.
邮槽通信是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入消息.
消息是先入先出的,客户端先写入的消息在服务端先被读取.
邮槽除了在本机内进行进程间通信外,在主机间也可以通信.
但是在主机间进行邮槽通信,数据通过网络传播时使用的是数据报协议(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);