命名管道如何实现不同机器两个进程间的通信?

要就要csdn 2013-09-06 06:50:43
本人是个新手,我想问下如何利用命名管道实现不同机器两个进程间的通信?我根据孙鑫老师视频里的教程编写了如下代码。
服务器进程代码:

void CNamedPipeSrvView::OnPipeCreate()
{
//创建命名管道
m_hPipe=CreateNamedPipe(_T("\\\\.\\pipe\\mypipe")
,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE,2,1024,1024,0,NULL);
if(INVALID_HANDLE_VALUE==m_hPipe)
{
MessageBox(_T("创建命名管道失败!"));
m_hPipe=NULL;
return;
}
HANDLE hEvent;
hEvent=CreateEvent(NULL,true,false,NULL);
if(!hEvent)
{
MessageBox(_T("创建事件对象失败"));
CloseHandle(m_hPipe);
m_hPipe=NULL;
return;
}
OVERLAPPED ovd;
ZeroMemory(&ovd,sizeof(OVERLAPPED));
ovd.hEvent=hEvent;
if(!ConnectNamedPipe(m_hPipe,&ovd))
{
if(ERROR_IO_PENDING!=GetLastError())
{
MessageBox(_T("等待客户端连接失败!"));
CloseHandle(m_hPipe);
m_hPipe=NULL;
CloseHandle(hEvent);
return;
}
}
if(WAIT_FAILED ==WaitForSingleObject(hEvent, INFINITE))
{
MessageBox(_T("等待对象失败!"));
CloseHandle(m_hPipe);
m_hPipe=NULL;
CloseHandle(hEvent);
return;
}
CloseHandle(hEvent);
}

void CNamedPipeSrvView::OnPipeRead()
{
// 读管道
wchar_t ch[100];
DWORD dwRead;
if(!ReadFile(m_hPipe,ch,100,&dwRead,NULL))
{
MessageBox(_T("读取数据失败!"));
return;
}
MessageBox(ch);
}

void CNamedPipeSrvView::OnPipeWrite()
{
// 写管道
wchar_t ch[]=_T("http://users9.jabry.com/pj7892002");
DWORD dwWrite;
if(!WriteFile(m_hPipe,ch,(wcslen(ch)+1)*2,&dwWrite,NULL))
{
MessageBox(_T("写入数据失败!"));
return;
}
}

客户端进程代码:

void CNamedPipeClientView::OnPipeConnect()
{
// 连接管道
/*if(!WaitNamedPipe(_T("\\\\ServerName\\pipe\\mypipe"),
NMPWAIT_WAIT_FOREVER))*/ //异地测试失败
if(!WaitNamedPipe(_T("\\\\.\\pipe\\mypipe"),
NMPWAIT_WAIT_FOREVER)) //本地测试成功
{
MessageBox(_T("当前没有可用的命名管道实例!"));
return;
}
m_hPipe=CreateFile(_T("\\\\AdminPj-PC\\pipe\\mypipe"),
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==m_hPipe)
{
MessageBox(_T("打开命名管道失败!"));
m_hPipe=NULL;
return;
}
}

void CNamedPipeClientView::OnPipeRead()
{
// 读管道
wchar_t ch[100];
DWORD dwRead;
if(!ReadFile(m_hPipe,ch,100,&dwRead,NULL))
{
MessageBox(_T("读取数据失败!"));
return;
}
MessageBox(ch);
}

void CNamedPipeClientView::OnPipeWrite()
{
// 写管道
wchar_t ch[]=_T("命名管道测试程序!");
DWORD dwWrite;
if(!WriteFile(m_hPipe,ch,(wcslen(ch)+1)*2,&dwWrite,NULL))
{
MessageBox(_T("写入数据失败!"));
return;
}
}

请问下要如何修改代码才能实现两台不同机器间进程间的通信?
...全文
753 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongnan12 2013-10-28
  • 打赏
  • 举报
回复
用一根网线连起来 然后名称设置成一样的就可以了
lm_whales 2013-10-26
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
Use the following form when specifying the name of a pipe in the CreateFile, WaitNamedPipe, or CallNamedPipe function: \\ServerName\pipe\PipeName
引用 6 楼 worldy 的回复:
Use the following form when specifying the name of a pipe in the CreateFile, WaitNamedPipe, or CallNamedPipe function: \\ServerName\pipe\PipeName
++
worldy 2013-10-24
  • 打赏
  • 举报
回复
Use the following form when specifying the name of a pipe in the CreateFile, WaitNamedPipe, or CallNamedPipe function: \\ServerName\pipe\PipeName
bsnry 2013-10-24
  • 打赏
  • 举报
回复
帮顶吧,很多api都忘了, 顶一下吧,呵呵
worldy 2013-10-24
  • 打赏
  • 举报
回复
引用 3 楼 u011546766 的回复:
你可以把管道看成是一个文件,一个进程往里写,另一个进程往外读。 这只能用在同一机器下的不同进程间进行通信。 如果是不同机器、呃~ 一台机器机器要访问另一台机器的文件,如果你只知道文件名,那你怎么从周围可能存在的众多机器找到你需要的那个文件?况且,不用的机器,有相同的文件很正常吧? 举个例子: 机器A创建了有名管道pp 机器B也创建了有名管道pp(这不会失败的) 机器C要读取有名管道pp的内容,你能分辨出,它是要读哪一个么? 所以、管道是用在同一机器不用进程间通信的,也可以用在同一进程的不同线程间通信。 如果你想在不同机器间通信,用socket的吧,这才是专门用来连接不同机器的。 跟用管道的方式差不多,创建->连接->发送/接受。
Named Pipes A named pipe is a named, one-way or duplex pipe for communication between the pipe server and one or more pipe clients. All instances of a named pipe share the same pipe name, but each instance has its own buffers and handles, and provides a separate conduit for client-server communication. The use of instances enables multiple pipe clients to use the same named pipe simultaneously. Any process can access named pipes, subject to security checks, making named pipes an easy form of communication between related or unrelated processes. Named pipes can be used to provide communication between processes on the same computer or between processes on different computers across a network. Any process can act as both a server and a client, making peer-to-peer communication possible. As used here, the term pipe server refers to a process that creates a named pipe, and the term pipe client refers to a process that connects to an instance of a named pipe.
一只小水鱼 2013-10-24
  • 打赏
  • 举报
回复
你可以把管道看成是一个文件,一个进程往里写,另一个进程往外读。 这只能用在同一机器下的不同进程间进行通信。 如果是不同机器、呃~ 一台机器机器要访问另一台机器的文件,如果你只知道文件名,那你怎么从周围可能存在的众多机器找到你需要的那个文件?况且,不用的机器,有相同的文件很正常吧? 举个例子: 机器A创建了有名管道pp 机器B也创建了有名管道pp(这不会失败的) 机器C要读取有名管道pp的内容,你能分辨出,它是要读哪一个么? 所以、管道是用在同一机器不用进程间通信的,也可以用在同一进程的不同线程间通信。 如果你想在不同机器间通信,用socket的吧,这才是专门用来连接不同机器的。 跟用管道的方式差不多,创建->连接->发送/接受。
要就要csdn 2013-09-08
  • 打赏
  • 举报
回复
高手速进呀,怎么回事?
要就要csdn 2013-09-07
  • 打赏
  • 举报
回复
怎么没人甩我呢
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧