我需要编写一个服务器,它接受来自多个客户端计算机的连接,维护已连接客户端的跟踪并根据需要发送单个客户端数据。有时,可以使用相同的消息立即联系所有客户,有时可能是一个客户或一组客户。
由于我需要确认客户端收到信息并且不想为UDP连接构建ACK结构,因此我决定使用TCP流方法。但是,我一直在努力了解如何维护多个连接并让它们保持空闲状态。
我似乎有三种选择。对每个传入连接使用fork来创建单独的子进程,使用pthread_create为每个进程创建一个完整的新线程,或使用select()等待连接的所有打开的套接字ID。
关于如何攻击这个的建议?我已经开始使用pthreads,但由于性能可能不是问题,因此多核处理不是必需的,也许有一种更简单的方法。
答案 0 :(得分:5)
子进程并不好,因为你只是移动球门柱。您将需要让您的子进程在彼此之间进行通信,然后您又回到同样的问题。
可以使用线程,但如果线程在套接字接收时阻塞,则会遇到其他问题。
select()(或更新的(POSIX)Unix上的poll())仍然是最好的解决方案。你告诉select()或poll()你要监视哪些套接字或描述符的事件(可能只是输入(读取)事件就足够了),然后你对那个被select标记的套接字或描述符做只读()/轮询()。保证recv()不会阻塞。
答案 1 :(得分:4)
阅读C10K页面了解大量选项。然后阅读High Performance Server Architecture文章。这些将为您回答很多问题。