zoukankan      html  css  js  c++  java
  • 进程间通信——— 油槽(Mailslot)

    /*邮槽(Mailslot)也称为邮件槽,其是 Windows 提供的一种用来实现进程间通信的手段,
    
    其提供的是基于不可靠的,并且是单向数据传输的服务。
    
    邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据,
    
    何为服务端?何为客户端?
    
    服务端就是创建邮槽的那一端,而客户端就是已存在的邮件槽的那一端。
    
    还有需要提及的一点是,客户端在使用邮槽发送数据的时候只有当数据的长度 < 425 字节时,
    
    才可以被广播给多个服务器,如果消息的长度 > 425 字节的话,那么在这种情形下,
    
    邮槽是不支持广播通信的。*/
    #include "stdafx.h"
    #include "MailslotClient.h"
    
    
    CMailslotClient::CMailslotClient()
    {
    }
    
    
    CMailslotClient::~CMailslotClient()
    {
    }
    
    void CMailslotClient::OnSend(char* szBuffer)
    {
        HANDLE                SendMailSlotHandle;
        DWORD                dwWrite;
    
        //打开由服务端创建的邮件槽
        SendMailSlotHandle = CreateFile(TEXT("\\.\mailslot\YIFIMailSlot"),
            GENERIC_WRITE, FILE_SHARE_READ, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (INVALID_HANDLE_VALUE == SendMailSlotHandle)
        {
            MessageBox(NULL,TEXT("打开邮槽失败 ..."), TEXT("提示"), MB_ICONERROR);
            return;
        }
        //通过邮件槽向服务端发送数据
        if (!WriteFile(SendMailSlotHandle, szBuffer, strlen(szBuffer), &dwWrite, NULL))
        {
            MessageBox(NULL,TEXT("写入数据失败 ..."), TEXT("提示"), MB_ICONERROR);
    
            CloseHandle(SendMailSlotHandle);
            return;
        }
        MessageBox(NULL,TEXT("写入数据成功 ..."), TEXT("提示"), MB_ICONINFORMATION);
    
     
         
    }
    #include <cstdio>
    #include "Mailslot.h"
    
    char* StrRecvData;
    CMailslot::CMailslot()
    {
        StrRecvData = new char[maxDataLen];
        memset(StrRecvData, 0, maxDataLen);
    }
    
    
    CMailslot::~CMailslot()
    {
    }
    
    //接收按钮的消息处理
    void CMailslot::OnRecv()
    {
        DWORD                ReadLength;
    
        //创建接收数据的线程,将邮槽句柄传递给线程
        CreateRecvThread((LPVOID)MailslotHandle, 0, NULL);
    }
    //线程处理函数
    DWORD WINAPI RecvThreadProc(LPVOID lpPrameter)
    {
        HANDLE                hRecvMailSlot;
        DWORD                dwRead;
    
        hRecvMailSlot = (HANDLE)lpPrameter;
    
        //利用传进来的邮槽句柄接收收据,并将数据存放到 pStrRecvData 中
        ReadFile(hRecvMailSlot, StrRecvData, maxDataLen, &dwRead, NULL);
        
        int a = GetLastError();
    
        printf("%s   %d
    ", StrRecvData,a);
        //关闭邮槽
        CloseHandle(hRecvMailSlot);
    
        return NULL;
    }
    
    void CMailslot::OnCreate()
    {
        //创建名为 ZacharyMailSlot 的邮槽
        MailslotHandle = CreateMailslot(TEXT("\\.\mailslot\YIFIMailSlot"), 0,MAILSLOT_WAIT_FOREVER, NULL);
    
        if (INVALID_HANDLE_VALUE == this->MailslotHandle)
        {
            MessageBox(NULL,TEXT("创建邮槽失败 ..."), TEXT("提示"), MB_ICONERROR);
            return;
        }
    }
    
    HANDLE CMailslot::CreateRecvThread(LPVOID lpParameter, DWORD threadFlag, LPDWORD lpThreadID)
    {
        //创建一个线程
        return CreateThread(NULL, 0, RecvThreadProc, lpParameter, threadFlag, lpThreadID);
    }
  • 相关阅读:
    Javascript创建对象的几种方式【转】
    log4net轻松使用日期作为动态文件名【转】
    使用jquery的lazy loader插件实现图片的延迟加载
    Oracle通用分页存储过程的创建与使用
    Oracle 11g R2的卸载与重装
    Oracle的rownum的原理和使用【转】
    Remoting客户端和服务端两种方式的调用总结
    动态执行SQL语句
    Trie模板
    Dijkstrapriority_queue
  • 原文地址:https://www.cnblogs.com/yifi/p/6596576.html
Copyright © 2011-2022 走看看