监听socket必须绑定一个端口,以便其他客户端可以连接到这个端口,并与该服务端进行通信。监听socket不绑定端口就无法接收连接请求。
每个连接都必须有一个唯一的Socket地址,即IP地址和端口号。TCP协议使用端口号来区分不同的应用程序和连接。
一个 socket 只能与一个 socket 建立连接。如果需要与多个 socket 建立连接,需要创建多个 socket 实例。
在RT-Thread中,可以通过以下方式将accept函数设置为非阻塞的:
- 设置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函数会立即返回,而不会一直等待新连接的到来。
- 使用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函数设置为非阻塞模式,避免程序一直等待连接的到来。文章来源:https://www.toymoban.com/news/detail-469166.html
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
文章来源地址https://www.toymoban.com/news/detail-469166.html
到了这里,关于tcp服务器设置accpet为非阻塞的两种处理方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!