想找些号的资料还真是麻烦.哎.
这个网址对有名管道讲的还算清楚.也给了较好的例子.
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>
- #include <stdio.h>
- #include <afxwin.h>
- #include <afxext.h>
- #include "../npipe.h"
- HANDLE m_hPipe;
- CString m_sMessage;
- UINT ReadProc();
- void main()
- {
- m_hPipe = CreateNamedPipe("////.//Pipe//Test", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道
- if (m_hPipe == INVALID_HANDLE_VALUE)
- {
- m_sMessage = "创建命名管道失败!";
- printf("%s", m_sMessage.GetBuffer(0));
- }
- else
- {
- m_sMessage = "成功创建命名管道!";
- //AfxBeginThread(ReadProc, this); // 开启线程
- TRACE(m_sMessage);
- printf("%s", m_sMessage.GetBuffer(0));
- ReadProc();
- }
- }
- UINT ReadProc()
- {
- char buffer[1024]; // 数据缓存
- DWORD ReadNum;
- if (ConnectNamedPipe(m_hPipe, NULL) == FALSE) // 等待客户机的连接
- {
- CloseHandle(m_hPipe); // 关闭管道句柄
- m_sMessage = "与客户机建立连接失败!"; // 显示信息
- printf("%s", m_sMessage.GetBuffer(0));
- return 0;
- }
- else
- {
- m_sMessage = "与客户机建立连接!"; // 显示信息
- printf("%s", m_sMessage.GetBuffer(0));
- }
- // 从管道读取数据
- if (ReadFile(m_hPipe, buffer, sizeof(buffer), &ReadNum, NULL) == FALSE)
- {
- CloseHandle(m_hPipe); // 关闭管道句柄
- m_sMessage = "从管道读取数据失败!"; // 显示信息
- printf("%s", m_sMessage.GetBuffer(0));
- }
- else
- {
- buffer[ReadNum] = '/0'; // 显示接收到的信息
- m_sMessage = CString(buffer);
- printf("%s", m_sMessage.GetBuffer(0));
- }
- return 1;
- }
客户端代码:
- #include "stdafx.h"
- #include "afx.h"
- #include "windows.h"
- #include <iostream>
- using namespace std;
- string m_sMessage;
- void main(int argc, char* argv[])
- {
- string Message = "[测试数据,由客户机发出]"; // 要发送的数据
- DWORD WriteNum; // 发送的是数据长度
- // 等待与服务器的连接
- if (WaitNamedPipe("////.//Pipe//TEST_PJTIME", NMPWAIT_WAIT_FOREVER) == FALSE)
- {
- m_sMessage = "等待连接失败!"; // 显示信息
- //printf("%s", m_sMessage.GetBuffer(0));
- printf("%s", m_sMessage.c_str());
- return;
- }
- // 打开已创建的管道句柄
- HANDLE hPipe = CreateFile("////.//Pipe//TEST_PJTIME", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hPipe == INVALID_HANDLE_VALUE)
- {
- m_sMessage = "管道打开失败!"; // 显示信息
- //printf("%s", m_sMessage.GetBuffer(0));
- printf("%s", m_sMessage.c_str());
- return;
- }
- else
- {
- m_sMessage = "成功打开管道!"; // 显示信息
- //printf("%s", m_sMessage.GetBuffer(0));
- printf("%s", m_sMessage.c_str());
- }
- // 向管道写入数据
- if (WriteFile(hPipe, Message.c_str(), Message.length(), &WriteNum, NULL) == FALSE)
- {
- m_sMessage = "数据写入管道失败!"; // 显示信息
- //printf("%s", m_sMessage.GetBuffer(0));
- printf("%s", m_sMessage.c_str());
- }
- else
- {
- m_sMessage = "数据成功写入管道!"; // 显示信息
- //printf("%s", m_sMessage.GetBuffer(0));
- printf("%s", m_sMessage.c_str());
- }
- CloseHandle(hPipe); // 关闭管道句柄
- char ccc;
- cin>>ccc;
- return ;
- }