利用命名管道实现进程之间的通信 .........

简介:   /*   命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信   与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据   我们可以通过      CreateNamedPipe()创建一个管道 ,可以指定模式是双向 即客户端 和服务端都可以进...
 

/*
  命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信   与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据
  我们可以通过
     CreateNamedPipe()创建一个管道 ,可以指定模式是双向 即客户端 和服务端都可以进行读写 管道    就跟基于 socket的TCP通信类似
  在服务端调用ConnectNamedPipe()来等待客户端连接管道 ,不像函数英文名字那样连接管道 而是等地啊客户端连接的到来 
 
 在客户端我们需要调用  WaitNamedPipe()函数来连接管道 

     在完成以上的工作之后 我们就可以利用  CreateFile()  ReadFile()   WriteFile()进行进程之间的通信了 
  
  在 油槽 命名管道 磁盘文件的读写 的时候我们都用到了  CreateFile()  ReadFile() WriteFile()  一样的函数  来进行操作   
*/

 

 

 

///////////////////////服务端
#include <iostream>
#include "windows.h"
#include <string>
using namespace std ;
void main()
{
 HANDLE  hNamedPipe=::CreateNamedPipe("\\\\.\\pipe\\path",  //管道名称    如果是不同主机需要吧.换成主机名字  或者直接换成*就可以实现全网内部的通信
                                   PIPE_ACCESS_DUPLEX, //管道可以双向通信
           PIPE_TYPE_BYTE,//数据以字节流的方式写入管道
           PIPE_UNLIMITED_INSTANCES, //表示管道能够创建的最大实例数目 这里只和操作系统相关
           1024, //输出缓冲区大小
           1024,//输入缓冲区大小
           0,//超时间隔
           NULL//默认安全结构
          ) ; 
    OVERLAPPED ov={0} ;  //定义一个OVERLAPPED结构体  并初始化为 0
 ::ConnectNamedPipe(hNamedPipe,&ov);  
    char buf[100]  ;
 DWORD len ;
 string s ;
 while(1)
 {
 ReadFile(hNamedPipe,(void*)buf,100,&len,NULL) ;  //如果连接到来了 那么我们就从管道读取数据  
    cout<<"客户端说:"<<buf<<endl ;
 cout<<"请输入发送给客户端的数据:"<<endl ;
 cin>>s;
 cout<<s<<endl ;
 WriteFile(hNamedPipe,(void*)s.c_str(),s.length()+1,&len,NULL);
 }


}

 

 

 

//////客户端

#include <iostream>
#include "windows.h"
using namespace std ;
void main()
{

 if(!::WaitNamedPipe("\\\\.\\pipe\\path",NMPWAIT_WAIT_FOREVER) )  //连接管道
 {
  cout<<"连接管道失败!"<<endl ;
  return  ;
 }
   
 HANDLE h1=::CreateFile("\\\\.\\pipe\\path",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) ;  //打开管道
 char buf[100]  ;
 DWORD len ;
 while(1)
 { 
  cout<<"请输入要写入的数据:"<<endl ;
  cin>>buf ;
  WriteFile(h1,(LPVOID)buf,strlen(buf)+1,&len,NULL) ;
  ReadFile(h1,(LPVOID)buf,100,&len,NULL) ;
  cout<<"服务器说:"<<buf<<endl ;
 }

 

}

 

 

 

目录
相关文章
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
2326 14
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
459 16
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
1241 4
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
366 0
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
1649 5
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能