我创建了一个带有服务器和客户端类的应用程序,它们具有创建tcp套接字或udp套接字的方法。现在我的要求是我创建了这个应用程序的两个应用程序实例。由于应用程序在unix环境中使用c ++,我使用putty软件来运行应用程序。我打开了两个腻子的例子。但现在我的要求如下:
两个应用程序实例之间可以有多个通信实例
每个通信实例,2个应用程序实例之间可以有多个通信实例
每个通信实例可以是UDP或TCP(从配置文件中确定)是UDP还是TCP(从配置文件确定
任何知道如何创建此类多个实例的人。
答案 0 :(得分:0)
嗯,所以有两个进程,但他们希望进程能够通过多对套接字相互通信?即,您可以在两个进程之间有两个(或更多)TCP套接字连接,和/或两个(或更多)UDP套接字来回发送数据包。
如果我的上一段是正确的(即如果我没有误解请求),那当然是可能的,尽管通过这样做获得的好处并不十分明显。然而,您需要做的是让应用程序的每个实例创建多个套接字(通过socket()+ bind()用于UDP套接字,或者通过socket()+ bind()+ listen()+ accept( )用于接受传入的TCP连接,或者通过socket()+ connect()来启动与其他程序实例的TCP连接。
管理多个套接字的棘手部分是正确处理等待。只使用一个套接字,您通常可以使用默认的阻塞I / O语义,这样您最终可以将套接字视为文件,并让每个send()或recv()操作(等)不管它在返回你的调用函数之前需要多长时间才能完成。
另一方面,对于多个套接字,您通常希望能够响应任何已准备好的套接字上的数据,这意味着您不能只阻止在任何一个特定套接字上等待,因为如果你这样做,你可能会在阻塞调用返回之前等待很长时间(可能永远!),同时你无法处理来自任何其他套接字的任何数据。 (当其中一个连接是刚刚拔出插头的计算机时,问题就变得特别明显了,因为通常需要花费几分钟才能确定远程计算机已经消失了)
要解决这个问题,你通常要么使用非阻塞I / O和套接字多路复用调用(例如poll()或select()或kqueue()),要么产生多个线程并让每个线程处理一个插槽。这两种方法都不是特别容易 - 套接多路复用方法一旦你掌握它就会很好用,但多路复用调用的语义有些复杂,需要一段时间才能完全理解它的工作方式。非阻塞I / O使事情进一步复杂化,因为这意味着您的代码必须正确处理部分读写。多线程方法起初看起来比较简单,但它有自己的更大更微妙的“陷阱”(竞争条件,死锁),如果你不太注意线程是什么,从长远来看可能会造成很大的痛苦。做和如何。
ps由于您处于Unix环境中,第三种可能的方法是fork()每个套接字的子进程。这类似于多线程方法,除了更安全一点,因为你的“线程”实际上是进程,每个都有自己独立的内存空间,因此他们在工作时不太可能互相攻击。缺点是内存使用量会增加,而且由于进程空间分离,进程之间相互通信会变得更加困难(并且更慢)。