荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 以命名管道方式实现网络进程间通信的一个实例
发信站: BBS 荔园晨风站 (Wed Jan 27 17:52:02 1999), 转信


   Win32位API集支持的命名管道(named pipe)是实现网络进程间通
信的一种有效手段。命名管道的接口比较简单,在程序中实现比较方
便,由其开发的应用程序也很容易使用,只要知道机器及管道的名称即
可连接两台机器上的两个进程。
    命名管道首先由一进程调用CreateNamedPipe函数创建,这一创建
命名管道的进程称为S erver进程,然后Server进程通过调用ConnectN
amedPipe函数等待一客户相连。在管道的另一段,Client进程用Creat
eFile函数或CallNamedPipe函数打开管道句柄,若无可用的管道实例,
Client进程可调用WaitNamedPipe函数等待。一旦连接成功,Client进
程和Server进程可调用函数ReadFile、WriteFile或ReadFileEx、Wri
teileEx传输信息。
    笔者在应用程序开发过程中,曾用命名管道方法做了实现网络两
进程间通信的一个小例子。这一例子实现了网络两进程间文本的实时
互编辑操作,即在任一台机器上对文本的修改可实时反映到另一台机
器上,就好像这一修改是在另一台机器上进行的一样。下面就对这一
实验程序作一介绍。
    程序分两部分:Server部分和Client部分。文中只介绍与命名管
道实现有关的内容。
    1.Server部分
    #define BUFSIZE 1280
    HANDLE hPipe;
    ∥管道句柄
    BOOL FConnected;
    int Success=0;
    typedef struct Infor{DWORD Type;char Text[BUFSIZE-64];};
∥信息传输结构
    struct infor Info;
    ∥包含编辑控制的对话框
    BOOL FAR PASCAL _export PipeServerDlg(HWND hDlg UINT mes
sage,WPARAM wParam, LPARAM IParam)
    {
    UINT IdTimer,DWORD ret,dwMode;
    switch(message){
        case WM_INITDIALOG;
     IdTimer=SetTimer(hDlg,IdTimer,50,(TIMERPROC)NULL);
     ∥Server创建命名管道
     hPipe=CreateNamedPipe("\\ \\.\\pipe\\buf",∥管道名
        PIPE_ACCESS_DUPLEX,
       ∥双向传输
        PIPE_WAIT|PIPE_TYPE_MESSAGE,
    ∥阻塞模式,消息流管道
        PIPE_UNLIMITED_INSTANCES,,
     ∥可以创建数目不限的管道实例
        BUFSIZE,BUFSIZE,1000,NULL);
     if(hPipe!=INVALID_HANDLE_VALUE){
        ∥管道句柄有效
     FConnected=ConnectNamedPipe(hPipe,NULL);∥等待连接
     if(FConected)Succes=1;∥连接成功
     else{CloseHandle(hipe);Succes=0;}
        }
        if(Succes==1){∥若连接成功,将阻塞模式变为非阻塞模式;
设置读模式为消息模式
        dwMode=PIPE_READMODE_MESSAGE|PIPE_NOWAIT;
        SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL);
        }
        return(TRUE);
    case WM_TIMER;
        if(Succes==1){∥若连接成功,定时读管道数据
     Info.Type=-1;∥设初始值
     if(ReadFile(hPipe,(char*)&Info,sizeof(Infor),&ret,NULL)
==TRUE){∥读管道数据
       if(Info.Type==-2){∥收到对方结束对话框信号,与对方同时
结束对话框
     KillTimer(hDig,IdTimer);   CloseHandle(hPipe); Succes=0
;
     EndDialog(hDlg,TRUE);   return(TRUE);
       }
       if(Info.Type==1)SetDlgItemText(hDlg,IDC_EDIT1,Info.Te
xt);
     ∥根据对方的变化修改编辑控制内容
     }   }
     break;
        case WM_COMMAND;
     if(GET_WM_COMMAND_ID(wParam,lParam)==IDOK){∥结束对话框
        KillTimer(hDlg.IdTimer);
        if(Succes==1){
       Info.Type=-2;∥置结束对话框信号
       WriteFile(hPipe,(char*)&Info,sizeof(Infor),&ret,NULL;
    ∥写数据到管道
       CloseHandle(hPipe);
        }
        Succes=0;EndDialog(hDlg,TRUE);return(TRUE);
      }
      if(Succes==1&&LOWORD(wParam)==IDC_EDIT1&&HIWORD(wParam
)== EN_UPDATE){∥得到已修改的编辑控制中的内容,并写入管道
        GetDlgItemText(hDlg,IDC_EDIT1,(LPSTR)(Info.Text),BUF
SIZE-64);
        Info.Type=1;∥Info.Type=1:修改
        WriteFile(hPipe,(char*)&Info,sizeof(Infor),&ret,NULL
);
      }
      break;
    }
    return(FALSE);
      }
    2.Client部分
      #define BUFSIZE 1280
      HANDLE hPipe∥管道句柄
      BOOL FConnected;
      int Succes=0,Flag=0;
      typedef struct Infor{DWORD Type;char Text[BUFSIZE-64];
};∥信息传输结构
      struct Infor Info;
      ∥包含编辑控制的对话框
      BOOL FAR PASCAL —export PipeClientDlg(HWND hDlg,UINT
message,WPARAM wPar am,  LPARAM lParam)
      {
      UINT IdTimer;
      DWORD ret,dwMode;
      switch(message){
        case WM_INITDIALOG:
     IdTimer=SetTimer(hDlg,IdTimer,50,(TIMERPROC)NULL);
    return(TRUE);
        case WM_TIMER;
     if(Succes==0&&Flag==0){ ∥若未打开管道句柄,定时作打开操

       ∥Client打开管道句柄
       hPipe=CreateFile("\\\\ServerName\\pipe\\buf", ∥管道

       ∥ServerName为运行服务器进程的机器名称
    GENERIC_READ|GENERIC_WRITE, ∥读/写模式
    0,∥文件非共享
    NULL,OPEN_EXISTING,0,NULL);
       if(hPipe!=INVALID_HANDLE_VALUE){∥句柄有效
    Succes=1;Flag=1;
       }
       else{
    Flag=1;
    if(!WaitNamedPipe("\\\\ServerName\\pipe\\buf",20000)Flag
=0;∥等待
    clse  Succes=1;
       }
       if(Succes==1){
    ∥若连接成功,将阻塞模式变为非阻塞模式;设置读模式为消息模

    dwMode=PIPE_READMODE_MESSAGE|PIPE_NOWAIT;
    SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL);
       }
        }
        if(Succes==1){ ∥若连接成功,定时读管道数据
     Info.Type=-1;∥设置初值
     if(ReadFile(hPipe,(char*)&Info,sizeof(Infor),&ret,NULL)
==TRUE){
        if(Info1.Type==-2){∥收到对方结束对话框信号,与对方同
时结束对话框
     KillTimer(hDlg,IdTimer);CloseHandle(hPipe);Succes=0;Fla
g=0;
     EndDialog(hDlg,TRUE);return(TRUE);
        }
        if(Info.Type==1)SetDlgItemText(hDlg.IDC_EDIT1,Info.T
ext);
     }
        }
        break;
      case WM_COMMAND;
        if(GET_WM_COMMAND_ID(wParam,1Param)==IDOK){∥结束对
话框
     KillTimer(hDlg,IdTimer);
     if(Succes==1{
        Info.Type=-2;WriteFile(hPipe,(char*)&Info,sizeof(Inf
or),&ret,NULL);
        CloseHandle(hPipe);
     }
     Succes=0;Flag=0;EndDialog(hDlg,TRUE);return(TRUE);
       }
       if(Succes==1&&LOWORD(wParam)==IDC_EDIT1&&
      HIWORD(wParam)==EN_UPDATE){
      GetDlgItemText(hDlg,IDC_ENIT1,(LPSTR)(Info.Text),BUFSI
ZE-64);
      Info.Type=1;WriteFile(hPipe,(char*)&Info,sizeof(Infor)
,&ret,NULL);
       }
       break;
     }
     return(FALSE);
    }

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店