该程序是一个客户端服务器套接字应用程序与Linux上的C开发。 每个客户端都有一个远程服务器连接并将自己logging为在线。 在任何时间点,很可能会有几个客户端在线,所有客户端都试图连接到服务器,以便将自己logging为在线/忙/闲等。那么服务器如何处理这些并发请求。 什么是一个好的devise方法(对于每个连接请求,分叉/multithreading可能?)?
当ai_socktype已经指定的时候,调用getaddrinfo()的时候,ai_protocol还有什么其他目的。
如何在不中断相关进程的情况下断开已build立的空闲连接? 和tcpkill不起作用
是否有可能重新使用故意左开放式套接字?
如何正确使用SO_RXQ_OVFL来检测Linux套接字上的UDP溢出?
为什么Windows Java不能绑定到已绑定的端口?
我个人会使用服务器的事件驱动方法。 在那里你注册一个回叫,一旦连接到达就被调用。 和事件回调,只要套接字准备好读取或写入。
有了大量的连接,与线程相比,您将拥有更好的性能和资源优势。 但是我也会提出这样一个小小的连接。
我只会使用线程,如果你真的需要使用多个核心,或者如果你有一些请求,可能需要更长的时间来处理,并且它太复杂,没有线程处理它。
我使用libev作为基础库来处理事件驱动的网络。
一般来说,你想要一个线程池来处理请求。
一个典型的结构将从一个单独的线程开始,它除了排队传入的请求外什么也不做。 由于它并没有做太多的事情,所以一个线程跟上网络的最大速度是非常容易的。
这将项目放入某种并发队列。 然后你有一个其他线程池从队列中读取项目,做所需要的,然后将结果存入另一个队列(并重复,直到服务器关闭)。
最后,你有另一个线程,只是从结果队列中取出项目,并将回复发送到客户端。
最佳方法是将事件驱动模型与多线程模型相结合。
你创建了一堆非阻塞套接字,但是线程数应该少得多。 即每个线程10个套接字。
然后,您只需在非阻塞模式下监听每个线程上的事件(传入请求),并在发生时处理它。
这种技术通常分别执行更好的非阻塞套接字或多线程模型。
看看Comer的“TCP / IP网间互联”第3卷(BSD套接字版本),它详细介绍了编写服务器和客户端的不同方式。 完整的代码(不幸的是,解释)在网络上。 或者在http://tldp.org翻遍 ,你会发现一些教程。
选择或轮询或epoll
这些是* nix系统上的工具,用于将多个事件源(连接)聚合成一个等待点。 服务器将连接添加到数据结构中,然后通过调用select等等来等待。当这些连接发生任何事情时,它们会被唤醒,找出哪个连接处理它,然后又回到睡眠状态。 详情请参阅手册。
在这些机制之上建立了几个更高层次的库,这使得编程变得更容易,例如libevent,libev等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。