命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。

  将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。命名管道提供了两种基本通信模式,字节模式和消息模式。在字节模式中,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位进行数据的收发,每次在管道上发出一条消息后,它必须作为一条完整的消息读入。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h> int _tmain(int argc, _TCHAR* argv[])
{
//接受所有安全描述(也就是把管道的连接权限降到最低).
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
if( InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) )
{
// add a NULL disc. ACL to the security descriptor.
if (SetSecurityDescriptorDacl(&sd, TRUE, (PACL) NULL, FALSE))
{
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor =&sd;
sa.bInheritHandle = TRUE; //创建一个命名管道,在windows中\代表zhuan'yi两个\\代表一个\
HANDLE hNamedPipe = CreateNamedPipeA("\\\\.\\pipe\\testName",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE, 1, 1024, 1024,0 , &sa);
//检查是否创建成功
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
printf("create named pipe failed!\n");
}
else Window
{
printf("create named pipe success!\n");
}
//异步IO结构
OVERLAPPED op;
ZeroMemory(&op, sizeof(OVERLAPPED));
//创建一个事件内核对象
op.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
//等待一个客户端进行连接
BOOL b = ConnectNamedPipe(hNamedPipe, &op);
//当有客户端进行连接时,事件变成有信号的状态
if (WaitForSingleObject(op.hEvent, INFINITE) == 0)
{
printf("client connect success!\n");
}
else
{
printf("client connect failed!\n");
}
//连接成功后,进行通信,读写
char buff[100];
sprintf_s(buff, 100, "test message from server!");
DWORD cbWrite;
WriteFile(hNamedPipe, buff, strlen(buff), &cbWrite, NULL); ZeroMemory(buff, 100);
ReadFile(hNamedPipe, buff, 100, &cbWrite, NULL);
//通信完之后,断开连接
DisconnectNamedPipe(hNamedPipe);
//关闭管道
CloseHandle(hNamedPipe);
}
} system("pause");
return 0;
}

  

#include "stdafx.h"
#include <windows.h>
#include <stdio.h> int _tmain(int argc, _TCHAR* argv[])
{
//检查命名管道是否存在
BOOL b = WaitNamedPipeA("\\\\.\\pipe\\testName", NMPWAIT_WAIT_FOREVER);
//打开管道
HANDLE hFile = CreateFileA("\\\\.\\pipe\\testName",
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//检查是否连接成功
if (!b || hFile == INVALID_HANDLE_VALUE)
{
printf("connect failed!\n");
}
else
{
printf("connect success!\n");
}
//进行通信
char buf[100];
ZeroMemory(buf, 100);
DWORD dwRead;
ReadFile(hFile, buf, 100, &dwRead, NULL);
printf(buf);
WriteFile(hFile, "test message for client!", strlen("test message for client!"), &dwRead, NULL);
//关闭管道
CloseHandle(hFile);
system("pause");
return 0;
}

  

windows命名管道的更多相关文章

  1. Windows进程间通信—命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将 ...

  2. windows namedPipe 命名管道clent and server

    1.client: #include "iostream" #include "windows.h" using namespace std; void mai ...

  3. Windows进程间通信--命名管道

    1 相关概述 命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制.命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信. ...

  4. Windows网络编程笔记3 ---- 邮槽和命名管道

    邮槽和命名管道的使用方法也很简单,只需几个有限的函数就可以实现双方的通信. 第三.邮槽 邮槽----进程间通信机制. 通过邮槽客户进程可以将消息通过广播给一个或多个服务进程.这是一个单向通信机制,缺点 ...

  5. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

  6. [C++] socket -8 [命名管道]

    ::命名管道不但能实现同一台机器上两个进程通信,还能在网络中不同机器上的两个进程之间的通信机制.与邮槽不同,命名管道是采用基于连接并且可靠的传输方式,所以命名管道传输数据只能一对一进行传输. /* 命 ...

  7. SQL Server 连接问题圣经-命名管道

    SQL Server 连接问题圣经-命名管道 (1) APGC DSD Team 12 Jan 2011 1:24 AM 3 一.前言 在使用SQL Server 的过程中,用户遇到的最多的莫过于连接 ...

  8. [杂]SQL Server 之命名管道连接

    命名管道是通过进程间通信(IPC)机制实现通信.具体来说,命名管道建立在服务器的IPC$共享基础上,通过IPC$共享来进行通信. SQL Server命名管道 SQL Server 首先在服务器上创建 ...

  9. C#命名管道通信

    C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通 ...

随机推荐

  1. Centos socket TCP代码

    一.功能描述: 能够在Centos中创建TCP socket,实现Client给Server发送消息,Server能够Client发送消息. 二.代码如下: ①client代码: #include & ...

  2. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  3. 不同系统与程序修改java.library.path的位置(转)

    原文地址:http://blog.csdn.net/quqibing001/article/details/51201768 Linux环境 系统变量LD_LIBRARY_PATH来添加Java.li ...

  4. SonarQube代码质量管理工具的升级(sonarqube6.2 + sonar-scanner-2.8 + MySQL5.6+)

    SonarQube升级注意事项 0. 前提条件 如果之前是使用sonarqube5.2 + sonar-runner-2.4 +MySQL5.5版本或者类似的组合. 安装方法请参照SonarQube代 ...

  5. Vue项目之背景图片打包后路径错误

    第一种方法: 原因: 首先,出错点在url-loader上面. // url-loader配置 // build/webpck.base.conf.js { test: /\.(png|jpe?g|g ...

  6. vue系列之vue-resource

    vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.也就是说,$.ajax能做的事情,vue-resource插件一样也能做到,而且 ...

  7. ROS----TUT-RIM协作机器人和Actin-ROS接口

    TUT-RIM: Collaborative Intelligent Heavy Machinery and Robotics http://www.ros.org/news/2017/02/tutr ...

  8. python算法双指针问题:两个有序数组的合并

    最近在看<你也能看得懂的python算法书>, 自己来实现一下里面的算法吧. 有书里的有所不同. 比如这个题目,我的实现如下: from django.test import TestCa ...

  9. 【BZOJ1135】[POI2009]Lyz

    题解: hall定理..第一次听说 思考了半小时无果 二分图匹配时间显然太大 但是有这个hall定理 二分图有完美匹配的充要条件是 对于左边任意一个集合(大小为|s|),其连边点构成的集合(大小为|s ...

  10. python学习之集合

    集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典. 创建格 ...