服务器可以在一个线程中处理多个套接字吗?

乔恩斯

我正在编写一个测试程序,该程序需要模拟虚拟机之间的多个连接,并且出于各种原因,似乎最好的方法是使用Unix域套接字。我使用SOCK_STREAM还是SOCK_DGRAM都没有关系,但是SOCK_STREAM看起来更容易使用。

我的问题似乎比典型情况有些落后。我想要一个客户端通过4个不同的套接字与服务器通信。(我可以有4个客户端,每个客户端有一个套接字,但是区别并不重要。)现在,我要模拟的事物没有多个线程,并且只要通过其中一个“套接字”接收到数据包,它就会中断。 ”。有一些简单的方法可以用Unix套接字模拟吗?

我认为我必须做的socket()bind()listen()所有4个插槽第一,然后做一个accept()对所有4个,并做fcntl( fd, F_SETFF, FNDELAY )了每个人,使他们非阻塞,这样我可以检查每一个数据read()在一个循环的方式。有什么方法可以使其受中断或事件驱动,以便我的主循环仅检查套接字中是否有数据吗?还是最好像这样轮询它们?

代码小丑42

是。处理多个连接几乎等同于“服务器”,它们通常是单线程的,但请不要这样:

以循环方式使用read()检查每个数据

正如您所提到的那样,这将需要非阻塞套接字和某种延迟,以防止“循环”成为导致系统繁忙的循环。

一个主要的问题是延迟的粒度。您不能将其设置得太小,否则当什么都没有发生时,循环仍会占用过多的CPU时间。可是你知道当事情发生的事情,这东西是数据上的多个连接同时进来的?现在,您的延迟会导致积压的滚雪球积压的订单,导致拒绝连接等。

这是不可行的,而且没有人以这种方式编写服务器,尽管我敢肯定,如果任何人都不知道打算解决该问题的库函数,就会认真考虑一下。请注意,联网是特定于平台的问题,因此它们实际上并不是C标准的一部分(C标准根本不处理套接字)。

的功能是select()poll(),和epoll(); 最后一个是linux特定的,另外两个是POSIX。基本思想是呼叫阻塞,直到任何数量的活动连接中的一个或多个准备好进行读取或写入。等待套接字准备好写入仅有意义地适用于NON_BLOCK套接字。但是,您不必使用NON_BLOCK,并且select()调用会阻塞。在各个套接字上使用NON_BLOCK会使实现更加复杂,但是却增加了单线程服务器中的性能潜力-这是异步服务器(例如nginx背后的想法,该范例与更传统的线程同步模型形成了对比。

但是,由于增加了复杂性,我建议您一开始不要使用NON_BLOCK。当/如果最终需要它,您将知道。您仍然不需要线程。

有很多关于如何select()特别使用的示例和教程

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在另一个线程中在python3中运行的非阻塞套接字服务器

来自分类Dev

服务器可以在c中打开两个TCP套接字吗?

来自分类Dev

如何使用另一个类初始化python线程套接字服务器?

来自分类Dev

创建一个能够每秒处理数千个请求的 TCP 套接字服务器

来自分类Dev

如何在Python中制作一个能记住客户端的简单多线程套接字服务器

来自分类Dev

如何将一个客户端连接到多个服务器套接字?

来自分类Dev

服务器可以直接连接它所连接的两个套接字吗?

来自分类Dev

可以在一个IP地址的服务器上托管多个站点吗?

来自分类Dev

在Qt服务器应用程序中处理多个套接字的最佳方法?

来自分类Dev

C ++-套接字服务器线程

来自分类Dev

服务器套接字从一个客户端读取对象,并在Java中的其他套接字上写入

来自分类Dev

如何在无服务器中为一个处理程序定义多个路径?

来自分类Dev

您可以从正在运行的 TCP 服务器中启动一个新的 TCP 服务器吗?

来自分类Dev

设置一个侦听文件套接字的HTTP服务器

来自分类Dev

Rust TCP套接字服务器仅使用一个连接

来自分类Dev

一个简单的客户端服务器套接字程序的PrintWriter和OutputStream

来自分类Dev

异步服务器套接字缺少第一个缓冲区流

来自分类Dev

创建一个新的TCP套接字-服务器端

来自分类Dev

我可以在两个或多个服务器上托管一个电子邮件帐户吗?

来自分类Dev

多少个用户可以在带套接字的android客户端,pc java服务器上处理?

来自分类Dev

sbt-native-packager可以将多个服务器应用程序打包在一个deb软件包中吗?

来自分类Dev

套接字服务器在同一进程中一次只接受一个连接

来自分类Dev

一个开源厨师服务器可以处理多少个节点

来自分类Dev

TCP 套接字客户端和服务器在一个程序中使用 c Linux

来自分类Dev

使用libev的多线程套接字服务器

来自分类Dev

程序无法加入用于服务器套接字的线程

来自分类Dev

我们可以制作具有阻塞套接字的非阻塞服务器吗?

来自分类Dev

Ubuntu(或服务器)可以运行64核(4X16)服务器(一个主板)吗?

来自分类Dev

是否可以让多个服务器共享一个 Firebase Cloud Messaging 服务器密钥?

Related 相关文章

  1. 1

    在另一个线程中在python3中运行的非阻塞套接字服务器

  2. 2

    服务器可以在c中打开两个TCP套接字吗?

  3. 3

    如何使用另一个类初始化python线程套接字服务器?

  4. 4

    创建一个能够每秒处理数千个请求的 TCP 套接字服务器

  5. 5

    如何在Python中制作一个能记住客户端的简单多线程套接字服务器

  6. 6

    如何将一个客户端连接到多个服务器套接字?

  7. 7

    服务器可以直接连接它所连接的两个套接字吗?

  8. 8

    可以在一个IP地址的服务器上托管多个站点吗?

  9. 9

    在Qt服务器应用程序中处理多个套接字的最佳方法?

  10. 10

    C ++-套接字服务器线程

  11. 11

    服务器套接字从一个客户端读取对象,并在Java中的其他套接字上写入

  12. 12

    如何在无服务器中为一个处理程序定义多个路径?

  13. 13

    您可以从正在运行的 TCP 服务器中启动一个新的 TCP 服务器吗?

  14. 14

    设置一个侦听文件套接字的HTTP服务器

  15. 15

    Rust TCP套接字服务器仅使用一个连接

  16. 16

    一个简单的客户端服务器套接字程序的PrintWriter和OutputStream

  17. 17

    异步服务器套接字缺少第一个缓冲区流

  18. 18

    创建一个新的TCP套接字-服务器端

  19. 19

    我可以在两个或多个服务器上托管一个电子邮件帐户吗?

  20. 20

    多少个用户可以在带套接字的android客户端,pc java服务器上处理?

  21. 21

    sbt-native-packager可以将多个服务器应用程序打包在一个deb软件包中吗?

  22. 22

    套接字服务器在同一进程中一次只接受一个连接

  23. 23

    一个开源厨师服务器可以处理多少个节点

  24. 24

    TCP 套接字客户端和服务器在一个程序中使用 c Linux

  25. 25

    使用libev的多线程套接字服务器

  26. 26

    程序无法加入用于服务器套接字的线程

  27. 27

    我们可以制作具有阻塞套接字的非阻塞服务器吗?

  28. 28

    Ubuntu(或服务器)可以运行64核(4X16)服务器(一个主板)吗?

  29. 29

    是否可以让多个服务器共享一个 Firebase Cloud Messaging 服务器密钥?

热门标签

归档