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】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值