我正在用C构建客户端/服务器架构。当客户端程序执行时,它连接到主程序(服务器)并等待。然后在某个时刻,主程序必须向客户端发送某种命令,客户端必须接收该命令并执行不同类型的操作,具体取决于遵循某些内部逻辑的命令。
这是最好的方法吗?
客户端是否应该每隔X秒向主站发送一个请求命令的数据包? (轮询)
我应该在客户端使用select()吗?
pd:客户端必须在每次发生X事件时向主人发送信息
答案 0 :(得分:0)
取决于您的问题和系统,但一般来说,如果您可以避免轮询,那么请避免它,因为您将浪费资源(网络资源,内存和CPU资源等......)。 您可以做的是异步处理从服务器接收的任何命令。
您提到客户端必须在x事件发生时向服务器发送信息。但是当服务器获得一些命令并且那些事件没有发生时呢?
在很多方面都使用了客户端/服务器架构,因此在您正在使用的区域中查找完善的示例可能是个好主意。
示例:
-Apache web server。
-MySQL
答案 1 :(得分:0)
这是最好的方法吗?
最好的方法是让TCP连接持续打开,I / O模型100%全双工和异步(我的意思是允许客户端和服务器在整个过程中发送和接收消息任何时候都可以连线;与一些不那么灵活的系统(如HTTP)相比较,这些系统基于客户端必须首先发送请求的想法,然后服务器才能发送响应;这是一个语义限制,使得难以达到最佳表现)
客户端是否应该向主服务器发送数据包要求 每X秒命令一次? (轮询)
如果你想获得良好的性能,那就好了 - 如果你这样实现它,那么当服务器首次拥有一个可用于客户端的命令和何时可用时,将会有一个不必要且不可预测的延迟(从0到X秒)。客户端收到该命令。
一般情况下(如提到的amine.ahd)尝试尽可能使事件驱动;轮询总是涉及在浪费网络带宽(过于轮询)和引入不必要的延迟(通过不经常轮询)之间进行权衡,并且通过避免轮询,您可以避免这种权衡,而是同时享受非常低的带宽使用和低延迟。 / p>
因此,如果您的客户有兴趣在事件发生时从服务器获取某些信息,客户端应该发送一条消息,通知服务器他的兴趣(或者只是让TCP连接足以暗示这种兴趣? )...然后,只要发生事件,服务器就可以简单地将信息发送到客户端。
我应该在客户端使用select()吗?
您几乎肯定希望在客户端和服务器中使用某些 I / O多路复用机制 - 无论是select()
,poll()
, kpoll()
,kqueue()
,WaitForMultipleEvents()
,asyncio等等。我通常在我的代码中使用select()
,因为它是最常见的机制,因此生成的代码几乎可以移植到任何操作系统; select()
对我来说一直都很好,我从来没有觉得有必要使用任何不同的东西;但如果您的用例意味着您不需要随身携带,那么其他一些机制可能会为您提供更高的CPU效率,尤其是在您有数百或数千个并发客户端连接的情况下。