加入 poll 或者 select 机制可以使程序更加健壮和高效,特别是在需要处理多个连接时。虽然上面的示例是基于单线程的 accept 和 read,它只能处理一个连接,直到它结束才能处理下一个连接。这种方法在简单应用中可能足够,但在实际生产环境中,通常会遇到需要同时处理多个连接的情况。
1,为什么需要 poll 或 select 机制?*
多连接支持:poll 或 select 允许程序同时监视多个文件描述符(包括 socket),并在任一文件描述符就绪时进行处理。这样可以实现并发处理多个客户端连接。
非阻塞操作:使用 poll 或 select 可以使每个连接的读写操作变为非阻塞的。这意味着程序不会因为等待某个连接的读写操作而停止响应其他连接。
资源利用率:通过 poll 或 select,可以有效地管理系统资源,避免不必要的轮询和资源浪费。
事件驱动:这些机制使得程序能够以事件驱动的方式运行,即在有事件发生时才进行相应的处理,而不是轮询或阻塞等待。
2,如何使用 poll?
在 C++ 中,可以使用 poll 函数来实现上述功能。下面是一个简单的示例,展示如何使用 poll 来处理多个连接:
#include <iostream>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#include <vector>
int main() {
int server_fd, client_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {
0};
// 创建 socket 文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
return 1;
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(12345);
// 绑定地址和端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
return 1;
}
// 开始监听连接
if (listen(server_fd, 5) < 0) {
perror("listen failed");
return 1;
}
std::vector<struct pollfd> fds;
fds.push_back({
server_fd, POLLIN,
标签:poll,socket,tcp,server,address,机制,include,连接
From: https://blog.csdn.net/jjjxxxhhh123/article/details/140241641