我必须为我的IT学校制作一个简单的IRC客户端/服务器程序。主题要求我们使用select(2)
套接字轮询,但禁止我们使用O_NONBLOCK
套接字。
- 您的服务器将接受多个同时连接。
注意,fork
禁止使用。因此,您必须强制使用select
- 您的服务器不得阻塞。
这与禁止使用的非阻塞套接字无关(因此请不要使用fcntl(s, O_NONBLOCK)
)
我想知道是否甚至有可能设计一个具有阻塞套接字的非阻塞服务器(它不会派生)select(2)
。
这是一个简单的示例:假设我们有一个简单的文本协议,每行一个命令。每个客户端都有一个缓冲区。当select(2)
告诉我们客户端已准备就绪时read(2)
,我们将进行读取,直到\n
在客户端缓冲区中找到为止,因此我们将处理该命令。对于非阻塞套接字,我们将阅读到EAGAIN
。
假设现在我们正在使用阻塞套接字,并且恶意客户端发送的文本没有换行符。select(2)
告诉我们数据可用,然后我们read(2)
在客户端上。但是我们永远不会读到期望的\n
。而不是返回EAGAIN
,系统调用将无限期阻塞。这是拒绝服务攻击。
真的有可能设计一个具有阻塞套接字和select(2)
(no fork(2)
)的非阻塞服务器吗?
是的,您从套接字读取一次,select
告诉您已准备就绪。如果read
包含\n
,则处理该行。否则,请存储收到的所有数据,然后立即返回select
。
当然,这意味着对于每个打开的套接字,您必须维护状态信息,并已读取数据缓冲区。这使代码可以read
独立处理每个代码,而无需在返回到之前完成整行select
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句