mar*_*s_p 8 c c++ sockets linux
我有一个关于UNIX中服务器编程的非常具体的问题(Debian,内核2.6.32).我的目标是学习如何编写可以处理大量客户端的服务器.我的目标是超过30 000个并发客户(即使我的大学提到有50万个可能,这似乎是QUIIITEEE的大量:-)),但我真的不知道(甚至可能是什么)这就是我要问的原因这里.所以我的第一个问题.有多少同时客户可能?客户端可以随时连接并与其他客户端联系并组成一个组(1个组最多包含12个客户端).他们可以互相聊天,因此TCP/IP包的大小取决于发送的消息.客户端还可以将数学公式发送到服务器.服务器将解决它们并将答案广播回组.这是一项非常繁重的操作.
我目前的方法是启动服务器.比使用fork创建一个守护进程.守护进程绑定套接字fd_listen并开始侦听.这是一个while(1)循环.我使用accept()来接听来电.
一旦客户端连接,我就为该客户端创建一个运行通信的pthread.客户端被添加到一个组并共享一些内存(需要保持组运行),但仍然每个客户端都在不同的线程上运行.获得正确的内存访问是一个很大的问题,但现在工作正常.
在程序的开头我读出了/ proc/sys/kernel/threads-max文件并根据我创建我的线程.根据该文件的可能线程数量约为5000.远离我希望能够服务的客户端数量.我考虑的另一种方法是使用select()和创建集.但是在集合中查找套接字的访问时间是O(N).如果我连接了超过几千个客户端,这可能会很长.如果我错了,请纠正我.
好吧,我想我需要一些想法:-)
Groetjes Markus
PS我为C++和C标记它,因为它适用于两种语言.
目前最好的方法是事件循环,如libevor libevent。
在大多数情况下,您会发现一个线程已经绰绰有余,但即使不是,您始终可以拥有多个带有单独循环的线程(至少对于 libev)。
libev[ent] 为每个操作系统使用最有效的轮询解决方案(并且任何东西都比select每个套接字一个线程更有效)。
| 归档时间: | 
 | 
| 查看次数: | 2507 次 | 
| 最近记录: |