且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

利用油槽实现进程之间的通信

更新时间:2022-08-13 08:36:23

 

//   油槽只能实现  一个进程写  一个进程读取 服务器读取 客户端写入     在服务器端只需 创建油槽然后即可通过 ReadFile和 WriteFile就可以实现向油槽的读写功能
//   在客户端需要利用CreateFile来打开一个油槽 然后通过CreateFile和ReadFile进行油槽的读写操作
//    油槽不仅能实现在本地进程之间的通信还可以实现网络进程之间的通信 
//    油槽名字的格式是 "\\\\.\\mailslot\\path"    如果服务端不在本地那么吧'.'换成主机名字 
//如果要实现全网的通信那么就把'.' 换成*  表示网内所有主机

 

///////服务器端代码

#include <iostream>
#include  "windows.h"
using namespace std ;
void main()
{
 HANDLE  hMailslot=::CreateMailslot("\\\\.\\mailslot\\mail",   //油槽的名称有固定格式
                                 0,  //指定可以写入到油槽的最大消息长度  0表示任意长度
            MAILSLOT_WAIT_FOREVER, //发生油槽读取时间的等待时间 这里是一直等待 如果0的话油槽没有声音就会立即返回
            NULL //油槽的安全结构属性默认为NULL
            ) ;
   if(hMailslot==INVALID_HANDLE_VALUE)
   {
    cout<<"油槽打开失败 !"<<endl ;
   }
 
 char buf[100] ; 
 DWORD  len ;
 while(1)
 {
  ::ReadFile(hMailslot,(void*)buf,100,&len,NULL) ;
  cout<<"客户端说:"<<buf<<endl ;

 }

}

 

 

/////客户端代码
#include <iostream>
#include "windows.h"
using namespace std ;
void main()
{

 HANDLE h1=::CreateFile("\\\\.\\mailslot\\mail",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==h1)
 {
  cout<<"油槽打开失败"<<endl ;
  return ;
 }
   
 char buf[100]  ;
   DWORD len;
   while(1)
   {
   cout<<"请输入要写入到油槽的数据:"<<endl ;
   cin>>buf;
   ::WriteFile(h1,(LPVOID)buf,strlen(buf)+1,&len,NULL) ;
   }

 

 

 

}