C++/CLI程序进程之间的通讯

现在,把大型软件项目分解为一些相交互的小程序似乎变得越来越普遍,程序各部分之间的通讯可使用某种类型的通讯协议,这些程序可能运行在不同的机器上、不同的操作系统中、以不同的语言编写,但也有可能只在同一台机器上,实际上,这些程序可看成是同一程序中的不同线程。而本文主要讨论C++/CLI程序间的通讯,当然,在此是讨论进程间通讯,而不是网络通讯。

简介

试想一个包含数据库查询功能的应用,通常有一个被称为服务端的程序,等待另一个被称为客户端程序发送请求,当接收到请求时,服务端执行相应功能,并把结果(或者错误信息)返回给客户端。在许多情况中,有着多个客户端,所有的请求都会在同一时间发送到同一服务端,这就要求服务端程序要更加高级、完善。

在某些针对此任务的环境中,服务端程序可能只是众多程序中的一个程序,其他可能也是服务端或者客户端程序,实际上,如果我们的数据库服务端需要访问不存在于本机的文件,那么它就可能成为其他某个文件服务器的一个客户端。一个程序中可能会有一个服务线程及一个或多个客户线程,因此,我们需小心使用客户端及服务端这个术语,虽然它们表达了近似的抽象含义,但在具体实现上却大不相同。从一般的观点来看,客户端即为服务端所提供服务的"消费者",而服务端也能成为其他某些服务的客户端。

服务端套接字

让我们从一个具体有代表性的服务端程序开始(请看例1),此程序等待客户端发送一对整数,把它们相加之后返回结果给客户端。

例1:

using namespace System;
using namespace System::IO;
using namespace System::Net;
using namespace System::Net::Sockets;

int main(array<String^>^ argv)
{
if (argv->Length != 1)
{
Console::WriteLine("Usage: Server port");
Environment::Exit(1);
}

int port = 0;

try
{
port = Int32::Parse(argv[0]);
}
catch (FormatException^ e)
{
Console::WriteLine("Port number {0} is ill-formed", argv[0]);
Environment::Exit(2);
}

/*1*/ if (port < IPEndPoint::MinPort || port > IPEndPoint::MaxPort)
{
Console::WriteLine("Port number must be in the range {0}-{1}",
IPEndPoint::MinPort, IPEndPoint::MaxPort);
Environment::Exit(3);
}

/*2*/ IPAddress^ ipAddress =
Dns::GetHostEntry(Dns::GetHostName())->AddressList[0];
/*3*/ IPEndPoint^ ipEndpoint = gcnew IPEndPoint(ipAddress, port);

/*4*/ Socket^ listenerSocket = gcnew Socket(AddressFamily::InterNetwork,
SocketType::Stream, ProtocolType::Tcp);

/*5*/ listenerSocket->Bind(ipEndpoint);

/*6*/ listenerSocket->Listen(1);
/*7*/ Console::WriteLine("Server listener blocking status is {0}",
listenerSocket->Blocking);

/*8*/ Socket^ serverSocket = listenerSocket->Accept();
Console::WriteLine("New connection accepted");
/*9*/ listenerSocket->Close();

/*10*/ NetworkStream^ netStream = gcnew NetworkStream(serverSocket);
/*11*/ BinaryReader^ br = gcnew BinaryReader(netStream);
/*12*/ BinaryWriter^ bw = gcnew BinaryWriter(netStream);

try
{
int value1, value2;
int result;

while (true)
{
/*13*/ value1 = br->ReadInt32();
/*14*/ value2 = br->ReadInt32();
Console::Write("Received values {0,3} and {1,3}",
value1, value2);

result = value1 + value2;
/*15*/ bw->Write(result);
Console::WriteLine(", sent result {0,3}", result);
}
}
/*16*/ catch (EndOfStreamException^ e)
{
}
/*17*/ catch (IOException^ e)
{
Console::WriteLine("IOException {0}", e);
}

/*18*/ serverSocket->Shutdown(SocketShutdown::Both);
/*19*/ serverSocket->Close();
/*20*/ netStream->Close();
Console::WriteLine("Shutting down server");
}

时间: 2024-09-29 11:10:06

C++/CLI程序进程之间的通讯的相关文章

如何实现进程间数据通讯技术

1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同在WIN16中对本地进程进行读写操作一样. 典型的WIN16两进程可以通过共享内存来进行数据交换:(1)进程A将GlobalAlloc(GMEM_SHARE...)API分配一定长度的内存:(2)进程A将GlobalAlloc函数返回的句柄传递给进程B(通过一个登录消息):(3)进程B对这个句柄调用

初步理解Python进程的信号通讯_python

信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT     终止进程  中断进程  (control+c) SIGTERM   终止进程     软件终止信号 SIGKILL   终止进程     杀死进程 SIGALRM 闹钟信号进程结束信号 SIGTERM和SIGKILL的区别 SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序.在关闭程序之前,您可以结束

线程之间的通讯---SynchronizationContext

过年前的这段时间真是舒服,没有了平时项目发版的紧张,剩下的就是只有在网上闲逛了,哈哈! 今天早上闲逛的时候,在CodeProject发现了个不错的文章,英文好的直接去http://www.codeproject.com/KB/threads/SynchronizationContext.aspx看吧,不好,就将就的看下我的吧,呵呵!(没有直接翻译,不过大概的思路相同) 理解SynchronizationContext SynchronizationContext 类是一个基类,可提供不带同步的自

单台服务器的PHP进程之间实现共享内存的方法_php技巧

开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop  与--enable-sysvsem 两个选项. IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互相的方法.基本的IPC处理机制有3种:它们分别是共享内存.信号量和消息队列.本文中我们主要讨论共享内存和信号量的使用. 在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法.如果你

代码-不同进程之间的切换?

问题描述 不同进程之间的切换? 问题详细情况是这样的: 假设现在linux下基于Qt开发的2个独立的进程A1.A2,现在A1全屏显示,此时怎么样可以切换到进程A2,让A2在屏幕上显示? 条件是这样的:A1与A2没有任何关系,不能用Alt+Tab键切换,A1与A2都是全屏显示. 所以此功能就类似点击桌面系统上的应用程序图标运行不同的程序. 初步思路是这样子的:再用一个独立的进程B,让B永远显示在界面中(只是一个小图标,类似搜狗输入法),然后通过 点击进程B来管理A1与A2的切换,但是不知道代码该怎

PostMessage和GetMessage能否在两个进程之间通信?

问题描述 一个A进程能否用PostMessage发送一个消息,使得一个B进程使用GetMessage将此消息获取到? 解决方案 解决方案二:关注解决方案三:好象是可以的吧解决方案四:线程可以使用PostMessage和PostThreadMessage来给发送消息到自己消息队列或者另一个线程的消息队列.解决方案五:需要在C#.Net中调用APIPostMessage函数来实现两个进程之间的通信,比如A.exe发个消息给B.exe,请问应该怎么做?解决方案六:C#.Net进程间通讯可以用IPCRE

使用IP地址在两个android手机之间如何通讯?

问题描述 使用IP地址在两个android手机之间如何通讯? 3g连接的基础上,能否可以分别查询200个android手机的IP地址? 能否直接使用IP 地址进行TCP通信吗? 希望大家给点建议,谢谢! 解决方案 直接P2P是不行的,因为移动上网时,是先连到运营商(如联通)的大局域网再通过网关转到公网,手机分配的IP是10.xx.xx.xx,并不是公网IP,你从外面查手机的IP都是运营商网关IP.而且两台手机也不一定在同一局域网段,也就不能保证直接互联能一定成功.解决办法还是像QQ一样,搞个服务

php 集成环境-我想问下php的集成环境的php版本和安装的php程序版本之间怎么样才能使用呢?

问题描述 我想问下php的集成环境的php版本和安装的php程序版本之间怎么样才能使用呢? 我想问下php的集成环境的php版本和安装的php程序版本之间怎么样才能正常使用呢?就是说哪个版本高一些 解决方案 可以参考下这篇文章http://blog.csdn.net/oneym/article/details/48050487 解决方案二: wamp集成环境下升级php版本集成的PHP环境的使用Linux环境Nginx安装多版本PHP

线程,进程间的通讯和同步原理及实现用例和应用

线程/进程间的通讯方式 -使用全局变量/共享内存 -使用thread中的lParam参数 -使用socket -使用窗口和消息 -使用命名管道/匿名管道 -使用cmd参数 -使用environment变量 线程的启动,退出和lParam参数通讯 VC: #include <windows.h> DWORD WINAPI ThreadProc(LPVOID lParam); DWORD dwThreadId; HANDLE hThread = CreateThread(NULL, 0, Thre