【发布时间】:2012-01-26 10:06:29
【问题描述】:
我一直在用 C 语言开发一个复杂的服务器-客户端系统,但我不确定如何实现套接字通信。
简而言之,系统是一个服务器应用程序,它与数据库通信并使用 UNIX 套接字与一个或多个使用fork() 创建的子进程通信。孩子们的目的是运行游戏服务器。启动游戏服务器的流程是这样的:
- 服务器/“管理器”标识数据库中要制作的游戏服务器。 (假设数据库通信已经排序。)
- 经理派生出一个孩子(“游戏控制器”)。
- 游戏控制器设置两个管道对,然后分叉,用一个管道替换其子级的 stdin,用另一个管道替换它的 stdout 和 stderr。
- 然后游戏控制器的子进程运行
execlp()以开始运行实际的游戏服务器可执行文件。
我在套接字方面的经验相当少。我之前在服务器应用程序上使用过select() 来“多路复用”众多客户端,如 GNU C 文档here 中的简单示例所示。
我现在有一个新的挑战,因为系统必须能够做更多事情:管理器需要能够任意向游戏控制器子节点发送命令(它会通过定期检查数据库来找到)并获得回复,但也期望从他们那里传入任意命令/错误并发送回复。
所以,我需要一种“上下文”系统,其中套接字仅在它们之间有意义。换句话说,当命令从管理器发送到游戏控制器时,每一方都需要知道谁在询问并知道回复是什么(因此,它是对哪个命令的回复)。
因为select() 仅用于知道我们何时有传入数据,并且线程应该阻塞它,我是否需要另一个线程来发送数据并获取回复?这是否会要求每个游戏控制器(虽然从技术上讲是“客户端”)使用监听套接字并同时使用 select()?
我希望我已经简明扼要地解释了系统和问题;如果需要,我会添加更多细节。谢谢!
【问题讨论】:
-
我想我理解了大部分内容,但你能解释一下“套接字只在它们之间有意义”的意思吗?
-
通过套接字发送的命令将得到其对应方的回复,就像您如何
accept()一样,您会收到一个在另一个方向流动的额外套接字?或者也许有一种更有效的方法来实现底层的外推过程。 -
不会“每一方都知道谁在询问”,因为他们知道他们从哪个套接字接收数据?