命名管道简单使用,以及局域网通信遇到的坑

命名管道的使用

一台计算机中的进程间通信

这种用法感觉是命名管道使用最普遍的方式,下面是根据网上大神的帖子,添加了一些代码,目的是实现局域网内的管道通信,具体还不是很明白,原帖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,虽然局域网之间通信应该是很少会用到命名管道,但是坑在这里,不填难受

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值