我们可以制作具有阻塞套接字的非阻塞服务器吗?

莱森克

我必须为我的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当非阻塞send()仅传输部分数据时,我们可以假定它在下一次调用时将返回EWOULDBLOCK吗?

Java的非阻塞Web服务器

我们可以通过RestTemplate调用启用Zuul的服务器吗

Python非阻塞服务器

带有recvfrom的udp非阻塞套接字并选择

为什么在C语言的套接字编程中我们需要服务器本身的IP地址

C ++非阻塞套接字-等待所有recv数据

我们可以在服务器的节点模块中提供静态文件吗?

为什么非阻塞式Web请求效率很高,因为在两种情况下我们都持有服务器线程

Python-使用选择器的非阻塞套接字

我们可以找到Google Cloud Speech API服务器吗?

Python非阻塞套接字关闭:可以引发BlockingIOError吗?

Express服务器被套接字阻塞

我们可以在服务器端(没有three.js)编辑(位置,缩放等)glTF模型吗?

在另一个线程中在python3中运行的非阻塞套接字服务器

具有非阻塞套接字的循环中的read()仅读取前1024个字节

我们可以在服务器中运行Uno平台应用程序吗?

我们可以创建没有SignalR的blazor服务器应用程序吗?

非阻塞并发wsgi服务器

非阻塞HTTP服务器中的阻塞代码

服务器的非阻塞套接字

非阻塞 Linux 服务器套接字

我们可以在 Kafka 中进行服务器端过滤吗?

非阻塞套接字可以从读取器/写入器引发 BlockingIOError 吗?

为什么我们使用无限循环让套接字服务器继续监听?

我们可以计划无服务器 aws 而不是部署吗?

我们可以在日志消息中添加服务器名称吗?

我们可以在没有任何服务器的浏览器中运行我们的 webpack (UI) 构建吗?

Python3:我们如何关闭 netlink 套接字阻塞 recv?