C - 使用 select() 时如何限制服务器中的入站连接数

2024-02-23

我对 C 套接字编程还是新手,但我能够创建一些简单的客户端和服务器程序。 我正在编写一个监听 TCP 连接的服务器,它的职责是响应客户端的请求,然后在客户端发送特殊的字节序列时(当然,或者当它断开连接时)关闭通信。

我开始使用以下代码对服务器进行编码accept()无限循环中的函数:服务器等待客户端,accept() 执行所有操作,close() 最后返回套接字描述符,然后再次返回等待接受新客户端。

由于我想一次为一个客户端提供服务,因此我以这种方式调用监听函数:listen(mysocket, 1);

一切都进行得很顺利,但是新的问题又出现了。上面解释的服务器部分在一个单独的线程(我们称之为线程#2)中运行,并且主线程(线程#1)必须能够告诉它终止。然后我创建了一个全局变量,如果该变量设置为 1(由线程 #1),则线程 #2 必须终止。问题是当线程 #2 被卡住时accept()函数被调用,因此它不能定期检查全局变量。

我显然需要该函数的超时值:“如果没有要接受的连接,请检查全局变量的值,如果设置为 0,则继续等待新连接;如果设置为 1,则终止”。

然后我用谷歌搜索了一个解决方案,发现select()函数做我需要的事情。虽然有点不一样,我还是第一次发现fd_set以及所有 FD_* 宏。我修改了服务器部分以使其与select()功能和一切都很好,但最后一个问题来了,我无法解决。 如果这样调用listen函数:listen(socket, 1);但服务器仍然同时接受和服务多个连接。这是否取决于select()与 fd_set 一起使用吗?我正在使用在网络上找到的一些示例,当接受连接时,它会创建一个新的套接字描述符,该描述符与所有其他套接字一起放入集合中。 我只想接受一个客户端的连接,我编写了一个简单的代码来识别是否应该为连接的客户端提供服务,但是有没有办法在服务器端断开连接?我知道我必须使用close()函数关闭套接字描述符,但是当使用select()我正在使用 fd_set,但我真的不知道如何关闭它们。 或者,有没有办法限制集合中套接字描述符的数量?我找到了 FD_SETSIZE 宏,但我无法让它工作,我什至不确定它是否解决了问题。

感谢您的时间!


The listen()函数有一个backlog确定在发送之前有多少传入请求可能处于待处理状态的参数may被拒之门外。措辞谨慎,以便操作系统实现可以支持more比你在listen()称呼。您可能无法控制积压连接的确切数量。

如果您必须一次仅支持一个客户端,则接受第二个连接,但告诉新客户端该连接此时不可用,然后关闭新连接。这样做的好处还在于您有机会告诉客户端连接不可用的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C - 使用 select() 时如何限制服务器中的入站连接数 的相关文章

随机推荐

  • Sublime 3 中的包控制不起作用?

    注意 我首先在论坛上搜索了 sublime 以便发布问题 因为我不确定这个问题是否适合这个特定的论坛 并想将其与其他帖子进行比较 如果它不应该在这里 请告诉我 我很乐意在此处关闭它并在任何其他 stackoverflow 论坛中打开它 谢谢
  • IIS 10.0 详细错误 - [httpDelete] [httpPut] 的 404.0

    我正在尝试在 ASP NET MVC 中创建一个 api 不幸的是 我有两个 HTTP 请求的问题 DELETE 和 PUT ActionName Index HttpGet public String Index return get A
  • 预接收挂钩被拒绝:提交消息中未发现 JIRA 问题?

    我已经提交并尝试将更改推送到存储库 但它给了我这个错误 remote refs heads feature OMT 1270 Missing French Translations cd54ab15bc8d5764ab12cf6fc202f
  • 如何从 Java 文本文件中读取逗号分隔值?

    我得到了这个文本文件 其中包含地图上不同点的纬度和经度值 如何将字符串拆分为纬度和经度 使用空格或制表符等其他分隔符执行此类操作的一般方法是什么 样本文件 28 515046280572285 77 38258838653564 28 51
  • 将不相关的集合映射到一个集合

    我有一个类 其中包含两个不同的不相关类型的集合 public class Entity ICollection
  • 在 Exchange Web 服务 (EWS) 中处理事件时识别项目类型

    我正在使用带有 EWS API 的流式通知 在事件处理程序中 我发现某个项目已被修改 但我尝试将修改后的项目绑定到电子邮件消息失败 错误信息具体是 服务 约会 返回的项目类型不兼容 与请求的项目类型 EmailMessage 似乎在尝试绑定
  • CSS 翻转卡 Internet Explorer 问题

    我正在尝试让 CSS 翻转卡在 Internet Explorer 11 中工作 我已阅读其他问题 解决方案是在翻转卡功能中添加 ms 前缀 我已经这样做了 但在 IE 11 中 翻转的卡片由于某种原因不显示背面 http jsbin co
  • 如何使用 PDFMake 和 vfs_fonts 在 Node.js 上创建 PDF?

    看起来像这样question https github com bpampuch pdfmake issues 642已经asked https stackoverflow com questions 41314411 create a l
  • 粘性前台服务无法重新启动,并出现“进程损坏”错误

    我有一个已启动的前台服务 我已注意从以下位置返回 START STICKY onStartCommand 我观察到前台服务不会无限期地运行 而是会被称为RestartProcessManager 本质上 维护一个进程 LRU 并且如果配置为
  • 由 __exit__ 中的 __enter__ 返回

    例如 我有这样的代码 with MyClass as x print I have only 0 format x with MyClass as y print I have 0 and 1 format x y print Again
  • SqlExceptionHelper:具有聚集列存储索引的表不支持游标

    我正在尝试从使用聚集列存储索引的 DWH SQL Server 表导入数据kudu通过flume 然而 经过我的习惯flumesource 从数据库检索一定数量的行 出现此异常 SqlExceptionHelper 具有聚集列存储索引的表不
  • 缩放 div 以适合窗口但保持宽高比

    如何缩放 div 以适合浏览器视图端口 但保留 div 的纵横比 我如何使用 CSS 和 或 JQuery 来做到这一点 您不需要为此使用 JavaScript 您可以使用纯CSS padding top 百分比是相对于包含块来解释的wid
  • 投射代理 - 获取 ClassCastException

    当我将动态代理类转换为我想要的对象时 我感到有些奇怪 在运行时 在某些条件下 我收到 ClassCastException 为了更好地解释这一点 这里是我想要使用的类 接口的定义 任何 应该 不相关的扩展接口都用括号括起来 public i
  • 在C中初始化char数组

    我不确定按以下方式初始化后 char 数组中会包含什么 char buf 5 0 这相当于 char buf 5 0 0 0 0 0 是的 是一样的 如果数量较少初始化器比数组中的元素大 那么剩余的元素将被初始化 就像具有静态存储持续时间的
  • 如何在sql server 2008中使用双while循环

    我正在开发一个约会日历应用程序 这里还是新手 我需要这方面的帮助 我需要在列中进行双循环 calendarID Slot Appointment Date slot 列的值将重复为 1 2 3 4 5 6 7 8 到 28 而 calend
  • 分开名字、中间名和姓氏 (Python)

    我有一个包含数百名成员的列表 我想按名字 中间名和姓氏分隔这些成员 但其中一些成员具有前缀 用 P 表示 所有可能的组合 First Middle Last P First Middle Last First P Middle Last P
  • React Native 0.44——堆栈导航器示例

    我正在尝试创建 React Native 应用程序的 Android 版本 但在使用 Android 导航器时遇到问题 下载示例代码 https ufile io lr8x5 首先创建一个文件 例如应用导航 js import StackN
  • 如何将 mat4 数组作为统一传递

    我必须将 mat4 数组作为统一传递给我的顶点着色器 如下所示 在顶点着色器中 uniform mat4 u jointMatrix 2 在我的 C 程序中 我这样做了 glm mat4 jointM 2 I filled jointM w
  • 查询 Android 日历甚至可以检索已删除的事件

    我正在使用下面提到的代码从保存在 Android 本地日历应用程序中的所有日历中检索所有事件 现在 如果我从本机日历中删除某个事件 我的代码仍然会获取并显示该事件 这怎么可能 它是否设置了一些删除标志而不是实际删除事件 Cursor cur
  • C - 使用 select() 时如何限制服务器中的入站连接数

    我对 C 套接字编程还是新手 但我能够创建一些简单的客户端和服务器程序 我正在编写一个监听 TCP 连接的服务器 它的职责是响应客户端的请求 然后在客户端发送特殊的字节序列时 当然 或者当它断开连接时 关闭通信 我开始使用以下代码对服务器进