c-在多线程TCP服务器中使用Listen()sys调用



我正在使用独立于系统的C语言在linux下使用Berkely SOCKET API进行多线程TCP服务器设计。服务器必须执行I/O多路复用,因为服务器是管理客户端的集中控制器(客户端永远保持与服务器的持久连接(除非运行客户端的机器出现故障等))。服务器至少需要处理500个客户端。我有一台16核心的机器,我想要的是生成16个线程(每个核心一个)和一个主线程。主线程将listen()分配给连接,然后将队列列表上的每个连接分配给线程,然后线程将调用accept(),然后使用select()系统调用来执行I/O多路复用。现在的问题是,我如何知道何时调度线程来调用accept()。我的意思是,我如何在主线程中发现listen()上有一个挂起的连接,以便分配一个线程来处理该连接。非常感谢所有的帮助。谢谢

函数调用listen()准备一个套接字来接受传入的连接。然后在该套接字上使用select(),并得到一个新连接到达的通知。然后在服务器套接字上调用accept,将返回一个新的套接字id。如果你喜欢,你可以把套接字id传递到你的线程上。

我要做的是使用一个线程来接受连接和接收数据,然后将数据作为工作项发送到队列中进行处理。

请注意,如果您的16个线程中的每一个都要运行select(或轮询,或其他),那么它们都将服务器套接字添加到它们的选择集中是没有问题的。

当服务器套接字处于传入连接时,可能会有多个套接字唤醒,但只有一个会成功调用accept,因此它应该可以工作。

Pro:易于编码。

Con:

  • 天真的实现无法平衡负载(需要例如全局每个线程处理的可接受套接字数的统计信息从其选择集中删除服务器套接字的高负载线程)
  • 在高接受率的情况下,雷鸣般的群体行为可能会产生问题

epoll或aio/asio。我怀疑你之前的帖子没有得到回复,因为当你要求一个可扩展的高性能解决方案时,你没有指定linux。不同操作系统上的异步解决方案都有大量的内核支持,而linux aio、Windows IOCP等的差异足以让"系统独立"并不适用——没有人能给你答案。

现在您已经将操作系统缩小到linux,请查找适当的异步解决方案。

最新更新