程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 調用WinApi實現郵槽通信C/S實例

調用WinApi實現郵槽通信C/S實例

編輯:關於C++

Just a test.高手無視.

服務端:

//Code by Pnig0s1992  
//Date:2012,3,19  
#include <stdio.h>  
#include <Windows.h>  
     
VOID UseMailSlot(LPTSTR lpMailSlotName);  
     
int main(int argc,char **argv)  
{  
    LPTSTR lpSlotName = TEXT("\\\\.\\mailslot\\first_slot");  
    UseMailSlot(lpSlotName);  
    return 0;  
}  
     
VOID UseMailSlot(LPTSTR lpMailSlotName)  
{  
    HANDLE hMailSlot;  
    BOOL bResult;  
    DWORD dwMessageSize;  
    DWORD dwMessageCount;  
    DWORD dwHasReadBytes;  
    hMailSlot = CreateMailslot(lpMailSlotName,0,MAILSLOT_WAIT_FOREVER,NULL);  
    if(hMailSlot == INVALID_HANDLE_VALUE)  
    {  
        printf("\nCreate mailslot:%S failed.",lpMailSlotName);  
        return;  
    }else
    {  
        printf("\nCreate mailslot successfully.");  
    }  
    int iCount = 0;  
    int index = 0;  
    while (1)  
    {  
        bResult = GetMailslotInfo(hMailSlot,NULL,&dwMessageSize,&dwMessageCount,NULL);  
        if(!bResult)  
        {  
            printf("\nGetMailslotInfo failed with error:%d",GetLastError());  
            CloseHandle(hMailSlot);  
            return;  
        }  
        if(dwMessageCount == 0)  
        {  
            printf("\nNo.%d wait for message.",iCount+1);  
            iCount++;  
            Sleep(2000);  
            continue;  
        }  
        while(dwMessageCount != 0)  
        {  
            LPTSTR lpMessageBuffer = (LPTSTR)HeapAlloc(GetProcessHeap

(),HEAP_ZERO_MEMORY,dwMessageSize);  
            if(lpMessageBuffer == NULL)  
            {  
                printf("\nHeapAlloc failed with error:%d",GetLastError());  
                CloseHandle(hMailSlot);  
                return;  
            }  
            bResult = ReadFile

(hMailSlot,lpMessageBuffer,dwMessageSize,&dwHasReadBytes,NULL);  
            if(!bResult)  
            {  
                printf("\nReadFile failed with error:%d",GetLastError());  
                HeapFree(GetProcessHeap(),0,lpMessageBuffer);  
                CloseHandle(hMailSlot);  
                return;  
            }  
            printf("\nReceive No.%d message from client.\nContent:%S",index+1,lpMessageBuffer);  
            index++;  
            HeapFree(GetProcessHeap(),0,lpMessageBuffer);  
            bResult = GetMailslotInfo(hMailSlot,0,&dwMessageSize,&dwMessageCount,NULL);  
            if(!bResult)  
            {  
                printf("\nGetMailslotInfo failed with error:%d",GetLastError());  
                return;  
            }  
        }  
    }  
    return;  
}

客戶端:

//Code by Pnig0s1992  
//Date:2012,3,19  
#include <stdio.h>  
#include <Windows.h>  
     
VOID ConnectToMailslot(LPTSTR lpMailslotName,LPTSTR lpMessage);  
     
int main(int argc,char ** argv)  
{  
    LPTSTR lpSlotName = TEXT("\\\\.\\mailslot\\first_slot");
    LPTSTR lpMessage = TEXT("Test for mailslot communication.");  
    ConnectToMailslot(lpSlotName,lpMessage);  
    return 0;  
}  
     
VOID ConnectToMailslot(LPTSTR lpMailslotName,LPTSTR lpMessage)  
{  
    HANDLE hFile;  
    hFile = CreateFile

(lpMailslotName,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);  
    if(hFile == INVALID_HANDLE_VALUE)  
    {  
        printf("\nCreateFile failed with error:%d",GetLastError());  
        return;  
    }  
    BOOL bResult;  
    DWORD dwHasWriteBytes;  
    bResult = WriteFile(hFile,lpMessage,(DWORD)(lstrlen(lpMessage)+1)*sizeof

(TCHAR),&dwHasWriteBytes,NULL);  
    if(!bResult)  
    {  
        printf("\nWriteFile failed with error:%d",GetLastError());  
        return;  
    }  
    printf("Send message to %S successfully.",lpMailslotName);  
    return;  
}

本文出自 “About:Blank H4cking” 博客,請務必保留此出處 http://pnig0s1992.blog.51cto.com/3933

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved