命名管道的使用
一台计算机中的进程间通信
这种用法感觉是命名管道使用最普遍的方式,下面是根据网上大神的帖子,添加了一些代码,目的是实现局域网内的管道通信,具体还不是很明白,原帖https://bbs.csdn.net/topics/310203566
注意管道名称的格式为\\servername\pipe\pipename 其中,如果是创建管道,servername必须为 . 如果是想获取局域网中服务器的管道,则servername应该是服务器的计算机名称,加引号是注意\ 需要转义
服务端,最简单的方式,创建管道,然后等待连接 mp_SendPipe 为HANDLE
//创建有名管道,一直等待
SECURITY_ATTRIBUTES st_Attributes;
SECURITY_DESCRIPTOR st_Descriptor;
if( InitializeSecurityDescriptor(&st_Descriptor, SECURITY_DESCRIPTOR_REVISION) )
{
// add a NULL disc. ACL to the
// security descriptor.
if (SetSecurityDescriptorDacl(&st_Descriptor, TRUE, (PACL) NULL, FALSE))
{
st_Attributes.nLength=sizeof(st_Attributes);
st_Attributes.lpSecurityDescriptor=&st_Descriptor;
st_Attributes.bInheritHandle= TRUE;
//创建有名管道
this->mp_SendPipe = CreateNamedPipe(TEXT(wch_SendName),
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE |PIPE_READMODE_BYTE|PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
MAX_FRAMEBUF_LEN,
MAX_FRAMEBUF_LEN,
NMPWAIT_WAIT_FOREVER,
&st_Attributes);
}
}
if(ConnectNamedPipe(this->mp_SendPipe, NULL)==TRUE)//阻塞,直到连接成功
{
cout<<"front pipe Connected!"<<endl;
}
//发送数据
DWORD ul_Slen=0;
if(!WriteFile(mp_SendPipe,mauc_FrameBuf,mus_FrameLen,&ul_Slen,0))//发送失败
{
i_Rtn = -1;
cout<<"send fail";
}
客户端 连接名称为wch_RecvName的管道
if(WaitNamedPipe(wch_RecvName, NMPWAIT_WAIT_FOREVER))//如果连接成功
{
//连接成功后更改状态为已连接
this->men_CommSta = COMMSTA_CONNECT;
this->mp_RcvPipe=CreateFile(wch_RecvName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
DWORD ul_Rlen=0;
//读取管道中的数据
if(!ReadFile(mp_RcvPipe,mauc_FrameBuf,MAX_FRAMEBUF_LEN,&ul_Rlen,NULL))//读取管道中的内容(管道是一种特殊的文件)
{
CloseHandle(mp_RcvPipe);//关闭管道
cout<<"-----read fail-----";
}
}
上面代码没有实际意义,如果需要使用,还需认真查看各函数参数意义,以及流程控制
说一下遇到的大坑,想用命名管道实现局域网通信,按照官网叙述,设置好管道名称,联机测试时不通过。后查看另外大神的帖子,需先建立ipc$ 通信 在控制台输入 net use \ip地址\ipc$ “password” /user:“username”
username password 为你的计算机账户和密码,开始第一次尝试时,居然联通了,客户机可以连接到服务机的管道,立马使用另外一个创建了两个管道的程序进行通信,发现只能获取到开始ipc$ 连接的那台计算机的管道,另一端不通,后面看到有人说两个ip地址只能建立一个ipc$连接,故又断开一端的连接,但是却无论如何也无法再次连接成功,网上不断查资料,更改计算机管道权限呀,修改组测表仍然不能够再次联通。。。。。。先记录一下坑,希望有机会来填,或者有大神明白的,希望告知1 2,虽然局域网之间通信应该是很少会用到命名管道,但是坑在这里,不填难受