tcp服务器设置accpet为非阻塞的两种处理方式

这篇具有很好参考价值的文章主要介绍了tcp服务器设置accpet为非阻塞的两种处理方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

监听socket必须绑定一个端口,以便其他客户端可以连接到这个端口,并与该服务端进行通信。监听socket不绑定端口就无法接收连接请求。

每个连接都必须有一个唯一的Socket地址,即IP地址和端口号。TCP协议使用端口号来区分不同的应用程序和连接。

一个 socket 只能与一个 socket 建立连接。如果需要与多个 socket 建立连接,需要创建多个 socket 实例。

在RT-Thread中,可以通过以下方式将accept函数设置为非阻塞的:

  1. 设置socket的属性

在调用accept函数之前,可以通过设置socket的属性来将其设置为非阻塞模式。例如,可以使用如下代码修改socket属性:

int sock = socket(AF_INET, SOCK_STREAM, 0);
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);

这将使得该socket处于非阻塞模式。接下来,调用accept函数会立即返回,而不会一直等待新连接的到来。

  1. 使用select函数

另一种方法是使用select函数来检查是否有新的连接可以接受。在这种情况下,可以将accept函数包含在一个无限循环中,并在每次循环中使用select函数来检查是否有新的连接到来。如果没有,可以将程序休眠一段时间后再次检查。

int sock = socket(AF_INET, SOCK_STREAM, 0);

while (1) {
    fd_set read_fds;
    FD_ZERO(&read_fds);
    FD_SET(sock, &read_fds);

    struct timeval tv;
    tv.tv_sec = 1;
    tv.tv_usec = 0;

    int ret = select(sock + 1, &read_fds, NULL, NULL, &tv);
    if (ret == -1) {
        // select出错
        continue;
    } else if (ret == 0) {
        // 没有新连接
        continue;
    }

    int new_sock = accept(sock, (struct sockaddr *)&addr, &addrlen);
    if (new_sock == -1) {
        // accept出错
        continue;
    }

    // 处理新连接
}

在这个例子中,使用select函数每隔一秒钟检查是否有新的连接到来。如果有,将调用accept函数来接受连接。如果没有,将继续等待下一个循环。

无论哪种方式,都可以将accept函数设置为非阻塞模式,避免程序一直等待连接的到来。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
tcp服务器设置accpet为非阻塞的两种处理方式文章来源地址https://www.toymoban.com/news/detail-469166.html

到了这里,关于tcp服务器设置accpet为非阻塞的两种处理方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 网络编程 —— 实现非阻塞式的服务器

    当 ServerSocketChannel 与 SockelChannel 采用默认的阻塞模式时,为了同时处理多个客户的连接,必须使用多线程 在非阻塞模式下, EchoServer 只需要启动一个主线程,就能同时处理三件事: 接收客户的连接 接收客户发送的数据 向客户发回响应数据 EchoServer 委托 Selector 来负责监控接

    2024年02月05日
    浏览(42)
  • Linux搭建Web服务器(一)——阻塞与非阻塞、同步与异步、Linux五种IO模型

    目录 0x01 阻塞与非阻塞、同步与异步 阻塞与非阻塞 同步与异步 总结 0x02 Unix、Linux上的五种IO模型 阻塞(blocking) 非阻塞(non-blocking——NIO) IO复用(IO multiplexing) 信号驱动(signal-driven) 异步(asynchronous) 为了理清楚这几个概念,我们可以从 数据就绪 以及 数据读写 层面

    2023年04月10日
    浏览(53)
  • VSCode无法连接远程服务器的两种解决方法

    直接在terminal或cmd中使用ssh命令可以连接服务器,但是在vscode中存在报错,最后一行为 Local server exit: 15 。一直要求Retry或者重新输入密码。 参考 在 /home/user/ 文件夹中删除 .vscode-server 目录,再重新连接。 参考 若解决方式1无效,可以在vscode中打开命令面板 (View - Command Palett

    2024年02月19日
    浏览(37)
  • 使用Vue脚手架配置代理服务器的两种方式

    本文主要介绍使用Vue脚手架配置代理服务器的两种方式 注意:Vue脚手架给我们提供了两种配置代理服务器的方式,各有千秋,使用的时候只能二选一,不能同时使用 除了cros和jsonp,还有一种代理方式,这种用的相对来说也很多, 一般代理服务器 这个概念很好理解,相当于生

    2024年02月02日
    浏览(62)
  • pycharm 连接远程服务器的两种方式 ssh Remote

    按服务器信息填写 在mapping栏下设置本地和远程仓库 (如果已经进入某个项目,可以选择Close Project退出至该页面) 按需配置服务器 右下角点击现在的环境名,点击Add New Interpreter -- Add Local Interpreter;选择已有的Conda环境。

    2024年02月07日
    浏览(46)
  • 操作教程|在MeterSphere中通过SSH登录服务器的两种方法

    MeterSphere开源持续测试平台拥有非常强大的插件集成机制,用户可以通过插件实现平台能力的拓展,借助插件或脚本实现多种功能。在测试过程中,测试人员有时需要通过SSH协议登录至服务器,以获取某些配置文件和日志文件,或者启动其他服务、执行脚本等,MeterSphere平台提

    2024年04月09日
    浏览(38)
  • OneNote由于某种原因,无法连接到服务器请尝试检查您的连接以查看服务器是否可用的两种解决方案

    本来一直在用OneNote记录东西,点击同步笔记的时候,突然冒出 “OneNote由于某种原因,无法连接到服务器请尝试检查您的连接以查看服务器是否可用” 警告错误。捣鼓了一会发现可以两种方案解决。 第一种:方法就是科学上网,再次点击同步笔记就可以了。 第二种:右键左下

    2024年02月06日
    浏览(62)
  • TCP服务器的演变过程:多进程实现一对多的TCP服务器

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。本节在上一章节的基础上,改为多进程方式实现TCP服务器,为每个新接入的客户端分配进程,实现一个

    2024年02月04日
    浏览(43)
  • TCP服务器的演变过程:IO多路复用机制select实现TCP服务器

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。 本节,在上一章节的基础上,将并发的实现改为IO多路复用机制,使用select管理每个新接入的客户端连

    2024年02月03日
    浏览(46)
  • TCP服务器的演变过程:揭秘使用多线程实现一对多的TCP服务器

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。本节在上一章节的基础上,添加多线程,为每个新接入的客户端分配线程,实现一个服务器程序处理多

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包