suncode

  博客园 :: 首页 :: 新随笔 :: :: :: 管理 ::

邮槽通信分为服务端和客户端,邮槽有服务端进行创建,创建时指定邮槽的名字,创建后获得邮槽的句柄,客户端可以通过句柄打开邮槽,获得句柄后可以向邮槽写入消息。邮槽服务是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入,消息是先进先出的,邮槽通信的数据可以是任意格式,但一条消息不能大于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);

  }

}


posted on 2011-03-08 18:39  suncode  阅读(330)  评论(0)    收藏  举报