mailslot怎么用

来源:互联网 发布:win7仿mac dock 编辑:程序博客网 时间:2024/06/02 19:46

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

       1  邮槽由服务端创建。

       2  客户端可以通过邮槽名打开。

       3  邮槽通信是单向通信。客写服读

       4 一条消息不能大于424byte

       5  能进行机内和机间通信

以下编译后先运行server后client


#include #include #include #include HANDLE hSlot;LPTSTR SlotName = TEXT("\\\\.\\mailslot\\sample_mailslot");BOOL ReadSlot() {     DWORD cbMessage, cMessage, cbRead;     BOOL fResult;     LPTSTR lpszBuffer;     TCHAR achID[80];     DWORD cAllMessages;     HANDLE hEvent;    OVERLAPPED ov;     cbMessage = cMessage = cbRead = 0;     hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));    if( NULL == hEvent )        return FALSE;    ov.Offset = 0;    ov.OffsetHigh = 0;    ov.hEvent = hEvent;     fResult = GetMailslotInfo( hSlot, // mailslot handle         (LPDWORD) NULL,               // no maximum message size         &cbMessage,                   // size of next message         &cMessage,                    // number of messages         (LPDWORD) NULL);              // no read time-out      if (!fResult)     {         printf("GetMailslotInfo failed with %d.\n", GetLastError());         return FALSE;     }      if (cbMessage == MAILSLOT_NO_MESSAGE)     {         printf("Waiting for a message...\n");         return TRUE;     }      cAllMessages = cMessage;      while (cMessage != 0)  // retrieve all messages    {         // Create a message-number string.          StringCchPrintf((LPTSTR) achID,             80,            TEXT("\nMessage #%d of %d\n"),             cAllMessages - cMessage + 1,             cAllMessages);         // Allocate memory for the message.          lpszBuffer = (LPTSTR) GlobalAlloc(GPTR,             lstrlen((LPTSTR) achID)*sizeof(TCHAR) + cbMessage);         if( NULL == lpszBuffer )            return FALSE;        lpszBuffer[0] = '\0';          fResult = ReadFile(hSlot,             lpszBuffer,             cbMessage,             &cbRead,             &ov);          if (!fResult)         {             printf("ReadFile failed with %d.\n", GetLastError());             GlobalFree((HGLOBAL) lpszBuffer);             return FALSE;         }          // Concatenate the message and the message-number string.          StringCbCat(lpszBuffer,                     lstrlen((LPTSTR) achID)*sizeof(TCHAR)+cbMessage,                     (LPTSTR) achID);          // Display the message.          _tprintf(TEXT("Contents of the mailslot: %s\n"), lpszBuffer);          GlobalFree((HGLOBAL) lpszBuffer);          fResult = GetMailslotInfo(hSlot,  // mailslot handle             (LPDWORD) NULL,               // no maximum message size             &cbMessage,                   // size of next message             &cMessage,                    // number of messages             (LPDWORD) NULL);              // no read time-out          if (!fResult)         {             printf("GetMailslotInfo failed (%d)\n", GetLastError());            return FALSE;         }     }     CloseHandle(hEvent);    return TRUE; }BOOL WINAPI MakeSlot(LPTSTR lpszSlotName) {     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)     {         printf("CreateMailslot failed with %d\n", GetLastError());        return FALSE;     }     return TRUE; }void main(){   MakeSlot(SlotName);   while(TRUE)   {      ReadSlot();      Sleep(3000);   }}

#include #include LPTSTR SlotName = TEXT("\\\\.\\mailslot\\sample_mailslot");BOOL WriteSlot(HANDLE hSlot, LPTSTR lpszMessage){   BOOL fResult;    DWORD cbWritten;     fResult = WriteFile(hSlot,      lpszMessage,      (DWORD) (lstrlen(lpszMessage)+1)*sizeof(TCHAR),       &cbWritten,      (LPOVERLAPPED) NULL);     if (!fResult)    {       printf("WriteFile failed with %d.\n", GetLastError());       return FALSE;    }     printf("Slot written to successfully.\n");    return TRUE;}int main(){    HANDLE hFile;    hFile = CreateFile(SlotName,      GENERIC_WRITE,      FILE_SHARE_READ,     (LPSECURITY_ATTRIBUTES) NULL,      OPEN_EXISTING,      FILE_ATTRIBUTE_NORMAL,      (HANDLE) NULL);     if (hFile == INVALID_HANDLE_VALUE)    {       printf("CreateFile failed with %d.\n", GetLastError());       return FALSE;    }     WriteSlot(hFile, TEXT("Message one for mailslot."));   WriteSlot(hFile, TEXT("Message two for mailslot."));   Sleep(5000);   WriteSlot(hFile, TEXT("Message three for mailslot."));    CloseHandle(hFile);     return TRUE;}

原创粉丝点击