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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐