select 示例
code
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <string.h>
constexpr int PORT = 8080;
constexpr int BUFFER_SIZE = 1024;
void setup(int &sockfd) {
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Failed to create socket");
exit(EXIT_FAILURE);
}
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
perror("Failed to bind socket");
close(sockfd);
exit(EXIT_FAILURE);
}
if (listen(sockfd, 5) < 0) {
perror("Failed to listen on socket");
close(sockfd);
exit(EXIT_FAILURE);
}
// Set non-blocking mode
fcntl(sockfd, F_SETFL, O_NONBLOCK);
std::cout << "Server listening on port " << PORT << std::endl;
}
int main() {
int serverSock, maxfd;
setup(serverSock);
fd_set readfds;
FD_ZERO(&readfds);
while (true) {
// Add server socket and standard input to the set
FD_SET(serverSock, &readfds);
FD_SET(STDIN_FILENO, &readfds);
maxfd = std::max(serverSock, STDIN_FILENO);
// Set timeout for select (2 seconds)
timeval timeout{};
timeout.tv_sec = 2;
timeout.tv_usec = 0;
int activity = select(maxfd + 1, &readfds, nullptr, nullptr, &timeout);
if (activity < 0 && errno != EINTR) {
perror("select error");
} else if (activity == 0) {
std::cout << "Timeout occurred! No activity detected.\n";
continue;
}
// Check if there's activity on the server socket
if (FD_ISSET(serverSock, &readfds)) {
sockaddr_in clientAddr{};
socklen_t addrLen = sizeof(clientAddr);
int clientSock = accept(serverSock, (struct sockaddr *)&clientAddr, &addrLen);
if (clientSock >= 0) {
std::cout << "New connection from " << inet_ntoa(clientAddr.sin_addr) << std::endl;
close(clientSock);
}
}
// Check if there's input on stdin
if (FD_ISSET(STDIN_FILENO, &readfds)) {
char buffer[BUFFER_SIZE];
ssize_t bytesRead = read(STDIN_FILENO, buffer, sizeof(buffer) - 1);
if (bytesRead > 0) {
buffer[bytesRead] = '\0';
std::cout << "Received input: " << buffer << std::endl;
}
}
}
close(serverSock);
return 0;
}
优缺:
优点: 跨平台
缺点:...
Last updated