现在的位置: 首页 > 综合 > 正文

windows下进程间通信-有名管道.

2013年08月21日 ⁄ 综合 ⁄ 共 3448字 ⁄ 字号 评论关闭

想找些号的资料还真是麻烦.哎.
这个网址对有名管道讲的还算清楚.也给了较好的例子.

http://blog.163.com/ssb_it/blog/static/44876165200852884527255/

这个网址把操作有名管道相关的win32 api封装为了一个类.使用应该很方便.
注意

  1:其demo里面的客户端测试程序的server mathine:应填成".",点代表本机,有名管带创建在本机上,
  2:客户端和服务器端代码编译时,均应该编译成 win32 debug版本,而不是win32 Unicode debug/release 版本.
     由于我的vc6没有安装unicode支持,会链接失败,提示,少了一个mfc4u...lib.
http://www.codeproject.com/KB/IP/cnamedpipe.aspx

下面是我自己整理的一些代码:

服务器端代码(要用mfc,代码有点乱):

该程序也演示了,如何在控制台程序中运用mfc的东东.呵呵.无非就是两个头文件嘛.
<afxwin.h>
<afxext.h>

  1. #include <stdio.h>
  2. #include <afxwin.h>
  3. #include <afxext.h>
  4. #include "../npipe.h"
  5. HANDLE m_hPipe;
  6. CString m_sMessage;
  7. UINT ReadProc();
  8. void main()
  9. {
  10.     m_hPipe = CreateNamedPipe("////.//Pipe//Test", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道
  11.     if (m_hPipe == INVALID_HANDLE_VALUE)
  12.     {
  13.         m_sMessage = "创建命名管道失败!";
  14.         printf("%s", m_sMessage.GetBuffer(0));
  15.     }
  16.     else
  17.     {
  18.         m_sMessage = "成功创建命名管道!";
  19.         //AfxBeginThread(ReadProc, this); // 开启线程
  20.         TRACE(m_sMessage);
  21.         printf("%s", m_sMessage.GetBuffer(0));
  22.         ReadProc();
  23.     }
  24. }
  25. UINT ReadProc()
  26. {
  27.     char buffer[1024]; // 数据缓存
  28.     DWORD ReadNum;
  29.     if (ConnectNamedPipe(m_hPipe, NULL) == FALSE) // 等待客户机的连接
  30.     {
  31.         CloseHandle(m_hPipe); // 关闭管道句柄
  32.         m_sMessage = "与客户机建立连接失败!"; // 显示信息
  33.         printf("%s", m_sMessage.GetBuffer(0));
  34.         return 0;
  35.     }
  36.     else
  37.     {
  38.         m_sMessage = "与客户机建立连接!"; // 显示信息
  39.         printf("%s", m_sMessage.GetBuffer(0));
  40.     }
  41.     // 从管道读取数据
  42.     if (ReadFile(m_hPipe, buffer, sizeof(buffer), &ReadNum, NULL) == FALSE)
  43.     {
  44.         CloseHandle(m_hPipe); // 关闭管道句柄
  45.         m_sMessage = "从管道读取数据失败!"; // 显示信息
  46.         printf("%s", m_sMessage.GetBuffer(0));
  47.     } 
  48.     else 
  49.     {
  50.         buffer[ReadNum] = '/0'; // 显示接收到的信息
  51.         m_sMessage = CString(buffer);
  52.         printf("%s", m_sMessage.GetBuffer(0));
  53.     }
  54.     return 1;

客户端代码:

  1. #include "stdafx.h"
  2. #include "afx.h"
  3. #include "windows.h"
  4. #include <iostream>
  5. using namespace std;
  6. string m_sMessage;
  7. void main(int argc, char* argv[])
  8. {
  9.         string Message = "[测试数据,由客户机发出]"// 要发送的数据
  10.         DWORD WriteNum; // 发送的是数据长度
  11.         // 等待与服务器的连接
  12.         if (WaitNamedPipe("////.//Pipe//TEST_PJTIME", NMPWAIT_WAIT_FOREVER) == FALSE)
  13.         {
  14.             m_sMessage = "等待连接失败!"// 显示信息
  15.             //printf("%s", m_sMessage.GetBuffer(0));
  16.             printf("%s", m_sMessage.c_str());
  17.             return;
  18.         }
  19.         // 打开已创建的管道句柄
  20.         HANDLE hPipe = CreateFile("////.//Pipe//TEST_PJTIME", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  21.         if (hPipe == INVALID_HANDLE_VALUE)
  22.         {
  23.             m_sMessage = "管道打开失败!"// 显示信息
  24.             //printf("%s", m_sMessage.GetBuffer(0));
  25.             printf("%s", m_sMessage.c_str());
  26.             return;
  27.         } 
  28.         else 
  29.         {
  30.             m_sMessage = "成功打开管道!"// 显示信息
  31.             //printf("%s", m_sMessage.GetBuffer(0));
  32.             printf("%s", m_sMessage.c_str());
  33.         }
  34.         
  35.         // 向管道写入数据
  36.         if (WriteFile(hPipe, Message.c_str(), Message.length(), &WriteNum, NULL) == FALSE)
  37.         {
  38.             m_sMessage = "数据写入管道失败!"// 显示信息
  39.             //printf("%s", m_sMessage.GetBuffer(0));
  40.             printf("%s", m_sMessage.c_str());
  41.         } 
  42.         else
  43.         {
  44.             m_sMessage = "数据成功写入管道!"// 显示信息
  45.             //printf("%s", m_sMessage.GetBuffer(0));
  46.             printf("%s", m_sMessage.c_str());
  47.         }
  48.         CloseHandle(hPipe); // 关闭管道句柄
  49.         char ccc;
  50.         cin>>ccc;
  51.         
  52.     return ;
  53. }

抱歉!评论已关闭.