邮槽通信分为服务端和客户端,邮槽有服务端进行创建,创建时指定邮槽的名字,创建后获得邮槽的句柄,客户端可以通过句柄打开邮槽,获得句柄后可以向邮槽写入消息。邮槽服务是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入,消息是先进先出的,邮槽通信的数据可以是任意格式,但一条消息不能大于424字节,数据通过网络传播时使用的是数据报协议(UDP),网络通信时客户端必须知道服务端的主机名或域名。
邮槽命名:
本 机: \\.\mailslot\[oath\]name 例:\\.\mailslot\win\suncode
不同主机:\\DomainName\mailslot\[path\]name
\\ComputerName\mailslot\[path\]name
进行广播: \\*\mailslot\[path\]name
创建邮槽 CreateMailslot
HANDLE WINAPI CreateMailslot(
LPCTSTR lpName, //邮槽名
DWORD nMaxMessageSize, //限制最大消息长度
DWORD lReadTimeout, //限制读超时的实践,设置为0或MAILSLOT_WAIT_FOREVER表示直到读到消息才返回
LPSECURITY_ATTRIBUTES lpSecurityAttributes //安全属性
);
获取邮槽信息 GetMailslotInfo
BOOL WINAPI GetMailslotInfo(
HANDLE hmailslot,
LPWORD lpMaxMessageSize,
LPWORD lpNexSize, //返回下一条消息的长度
LPWORD lpMessageCount,
LPWORD LPReadTimeout,
);
修改度操作时间、超时时间 SetMailslotInfo
BOOL WINAPI SetMailslotInfo(
HANDLE hMailslot;
DWORD lReadTimeout;
);
读取消息 ReadFile, 写入消息WriteFile
*****************************
服务端程序:
*****************************
#include<windows.h>
#include<stdio.h>
HANDLE hSlot;
LPTSTR lpszSlotName = TEXT("\\\\.\\mailslot\\sampe_mailslot");
LPTSTR Message=TEXT("Message for mailslot.");
void main()
{
DWORD cbMessage, cMessage, cbRead;
BOOL fResualt;
LPTSTR lpszBuffer;
TCHAR achID[80];
hSlot=CreateMailslot(lpszSlotName, 0, MAILSLOT_WAIT_FOREVER, (LPSECURITY_ATTRIBUTES)NULL);
if (hSlot==INVALID_HANDLE_VALUE)
{
printf("Create failed with %d\n", GetLastError());
return;
}
while(1)
{
fResult=GetMailslotInfo(hSlot, (LPTSTR)NULL, &cbMessage, &cMessage, (LPTSTR)NULL);
while (cMessage!=0)
{
lpszBuffer=(LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lstrlen((LPTSTR)achID)*sizeof(TCHAR) + cbMessage);
}
if (NULL==lpszBuffer)
{
return;
}
fResult=ReadFile(hSlot, lpszBuffer, cbMessage, &cbRead, NULL);
}
}

浙公网安备 33010602011771号