🌷🌷🌷🌷① 基于select函数的多路复用
🌷🌷🌷🌷② 基于epoll函数的多路复用
① 基于select函数的多路复用
select函数是一种多路复用技术,它可以同时监视多个文件描述符的状态,当某个文件描述符就绪时,select函数会返回该文件描述符的信息。在C++网络编程中,我们可以利用select函数实现多个客户端和一个服务端之间的通信。以下是一个基于select函数的C++网络编程例子:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <cstring>
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr{}, client_addr{};
char buffer[1024]{};
fd_set read_fds, all_fds;
int max_fd, fd_num;
// 创建socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
std::cerr << "Failed to create socket" << std::endl;
return -1;
}
// 绑定地址
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
std::cerr << "Failed to bind address" << std::endl;
return -1;
}
// 监听连接
if (listen(server_fd, 5) < 0) {
std::cerr << "Failed to listen connections" << std::endl;
return -1;
}
// 初始化文件描述符集合
FD_ZERO(&all_fds);
FD_SET(server_fd, &all_fds);
max_fd = server_fd;
// 循环等待客户端连接
while (true) {
read_fds = all_fds;
fd_num = select(max_fd + 1, &read_fds, nullptr, nullptr, nullptr);
if (fd_num < 0) {
std::cerr << "Failed to select" << std::endl;
return -1;
}
// 处理新的客户端连接
if (FD_ISSET(server_fd, &read_fds)) {
socklen_t client_len = sizeof(client_addr);
client_fd = accept(server_fd, (struct sockaddr *) &client_addr, &client_len);
if (client_fd < 0) {
std::cerr << "Failed to accept client connection" << std::endl;
return -1;
}
std::cout << "New client connected, fd=" << client_fd << std::endl;
FD_SET(client_fd, &all_fds);
max_fd = std::max(max_fd, client_fd);