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

要就要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;
}
}

请问下要如何修改代码才能实现两台不同机器间进程间的通信?
...全文
844 8 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
怎么没人甩我呢

16,550

社区成员

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

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

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