我正在编写一个测试程序,该程序需要模拟虚拟机之间的多个连接,并且出于各种原因,似乎最好的方法是使用Unix域套接字。我使用SOCK_STREAM还是SOCK_DGRAM都没有关系,但是SOCK_STREAM看起来更容易使用。
我的问题似乎比典型情况有些落后。我想要一个客户端通过4个不同的套接字与服务器通信。(我可以有4个客户端,每个客户端有一个套接字,但是区别并不重要。)现在,我要模拟的事物没有多个线程,并且只要通过其中一个“套接字”接收到数据包,它就会中断。 ”。有一些简单的方法可以用Unix套接字模拟吗?
我认为我必须做的socket()
,bind()
和listen()
所有4个插槽第一,然后做一个accept()
对所有4个,并做fcntl( fd, F_SETFF, FNDELAY )
了每个人,使他们非阻塞,这样我可以检查每一个数据read()
在一个循环的方式。有什么方法可以使其受中断或事件驱动,以便我的主循环仅检查套接字中是否有数据吗?还是最好像这样轮询它们?
是。处理多个连接几乎等同于“服务器”,它们通常是单线程的,但请不要这样:
以循环方式使用read()检查每个数据
正如您所提到的那样,这将需要非阻塞套接字和某种延迟,以防止“循环”成为导致系统繁忙的循环。
一个主要的问题是延迟的粒度。您不能将其设置得太小,否则当什么都没有发生时,循环仍会占用过多的CPU时间。可是你知道当事情被发生的事情,这东西是数据上的多个连接同时进来的?现在,您的延迟会导致积压的滚雪球积压的订单,导致拒绝连接等。
这是不可行的,而且没有人以这种方式编写服务器,尽管我敢肯定,如果任何人都不知道打算解决该问题的库函数,就会认真考虑一下。请注意,联网是特定于平台的问题,因此它们实际上并不是C标准的一部分(C标准根本不处理套接字)。
的功能是select()
,poll()
,和epoll()
; 最后一个是linux特定的,另外两个是POSIX。基本思想是呼叫阻塞,直到任何数量的活动连接中的一个或多个准备好进行读取或写入。等待套接字准备好写入仅有意义地适用于NON_BLOCK套接字。但是,您不必使用NON_BLOCK,并且select()
调用会阻塞。在各个套接字上使用NON_BLOCK会使实现更加复杂,但是却增加了单线程服务器中的性能潜力-这是异步服务器(例如nginx)背后的想法,该范例与更传统的线程同步模型形成了对比。
但是,由于增加了复杂性,我建议您一开始不要使用NON_BLOCK。当/如果最终需要它,您将知道。您仍然不需要线程。
有很多关于如何select()
特别使用的示例和教程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句