在C++ Linux环境中创建多个通信实例

在C++ Linux环境中创建多个通信实例,linux,multithreading,sockets,Linux,Multithreading,Sockets,我已经创建了一个带有服务器和客户端类的应用程序,它们具有创建tcp套接字或udp套接字的方法。现在我的要求是我已经创建了这个应用程序的两个应用程序实例。由于应用程序是在UNIX环境中的C++,所以我使用P腻y软件来运行应用程序。我已经打开了两个腻子实例。但现在我的要求如下: 两个应用程序实例之间可以有多个通信实例 在每个通信实例中,两个应用程序实例之间可以有多个通信实例 每个通信实例可以是配置文件中确定的UDP或TCP,也可以是配置文件中确定的UDP或TCP 任何知道如何创建这样多个实例的人 H

我已经创建了一个带有服务器和客户端类的应用程序,它们具有创建tcp套接字或udp套接字的方法。现在我的要求是我已经创建了这个应用程序的两个应用程序实例。由于应用程序是在UNIX环境中的C++,所以我使用P腻y软件来运行应用程序。我已经打开了两个腻子实例。但现在我的要求如下:

两个应用程序实例之间可以有多个通信实例

在每个通信实例中,两个应用程序实例之间可以有多个通信实例

每个通信实例可以是配置文件中确定的UDP或TCP,也可以是配置文件中确定的UDP或TCP


任何知道如何创建这样多个实例的人

Hmm,所以有两个进程,但它们希望这些进程能够通过多对套接字相互通信?i、 e.两个进程之间可以有两个或多个TCP套接字连接,和/或两对或多对UDP套接字来回发送数据包

如果我的上述段落是正确的,也就是说,如果我没有误解这个请求,那当然是可能的,尽管你这样做会获得什么好处还不是很明显。然而,您需要做的是让应用程序的每个实例创建多个套接字,或者通过套接字+绑定(用于UDP套接字),或者通过套接字+绑定+侦听+接受(用于接受传入的TCP连接),或者通过套接字+连接(用于启动到其他程序实例的TCP连接)

管理多个套接字的棘手部分是正确处理等待。只有一个套接字,您通常可以不使用默认的阻塞I/O语义,这样您就可以将套接字视为一个文件,让每个send或recv操作等在返回调用函数之前完成所需的时间

另一方面,对于多个套接字,您通常希望能够响应任何已准备就绪的套接字上的数据,这意味着您不能只阻塞任何一个特定套接字上的等待,因为如果这样做,您可能会被困在等待很长一段时间,甚至永远!在阻塞调用返回之前,同时您无法处理来自任何其他套接字的任何数据。当其中一个连接连接到刚刚拔出插头的计算机时,问题变得特别明显,因为TCP堆栈通常需要几分钟才能确定远程计算机已经离开

为了解决这个问题,您通常需要使用非阻塞I/O和套接字多路复用调用,例如poll或select或kqueue,或者生成多个线程,让每个线程处理一个套接字。这两种方法都不是特别容易的-套接字多路复用方法在掌握了窍门后就可以很好地工作,但是多路复用调用的语义有些复杂,需要一段时间才能完全理解它的工作原理。非阻塞I/O使事情更加复杂,因为它意味着您的代码必须正确处理部分读写。多线程方法一开始似乎更简单,但它有一组更大、更微妙的“gotchas”竞争条件、死锁,如果您对线程正在做什么以及如何做不太小心,从长远来看,这些死锁可能会造成很大的痛苦


ps由于您处于Unix环境中,第三种可能的方法是为每个套接字分叉一个子进程。这与多线程方法类似,只是安全一点,因为线程实际上是进程,每个线程都有各自独立的内存空间,因此它们在工作时不太可能互相绊倒。缺点是内存使用率较高,另外,由于进程空间的分离,进程之间的通信变得更加困难和缓慢。

还有一件事,因为应用程序正在读取配置文件,所以从该应用程序的单个实例创建的多个实例可以同时创建服务器和客户端。我不明白您想要什么,您有两个应用程序实例正在运行,您想在它们之间进行通信吗?这就是你想要的?这两个实例是在同一台机器上还是在不同的机器上?谢谢。。很好的解释。。我已经使用多线程实现了这一点。。我也会尝试其他方法。