admin 管理员组

文章数量: 887021


2023年12月22日发(作者:scratch软件编程)

linux socket select 例子

下面是一个简单的基于 Linux Socket 和 select 函数的例子,它演示了如何在多个套接字上使用 select 监听可读性。

#include

#include

#include

#include

#include

#define MAX_CLIENTS 10

#define PORT 8080

int main() {

int server_fd, new_socket,

client_sockets[MAX_CLIENTS], max_clients = MAX_CLIENTS;

struct sockaddr_in address;

int addrlen = sizeof(address);

char buffer[1025] = {0};

// 创建主套接字

if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) ==

0) {

1 / 6

perror("Socket creation failed");

exit(EXIT_FAILURE);

}

_family = AF_INET;

_addr.s_addr = INADDR_ANY;

_port = htons(PORT);

// 将套接字绑定到本地端口

if (bind(server_fd, (struct sockaddr *)&address,

sizeof(address)) < 0) {

perror("Bind failed");

exit(EXIT_FAILURE);

}

// 监听连接

if (listen(server_fd, 3) < 0) {

perror("Listen failed");

exit(EXIT_FAILURE);

}

printf("Server listening on port %d n", PORT);

2 / 6

// 初始化客户端套接字集合

for (int i = 0; i < max_clients; i++) {

client_sockets[i] = 0;

}

while (1) {

fd_set readfds;

FD_ZERO(&readfds);

// 添加主套接字到读取集合

FD_SET(server_fd, &readfds);

int max_sd = server_fd;

// 添加客户端套接字到读取集合

for (int i = 0; i < max_clients; i++) {

int sd = client_sockets[i];

if (sd > 0) {

FD_SET(sd, &readfds);

}

3 / 6

if (sd > max_sd) {

max_sd = sd;

}

}

// 使用 select 监听可读性

if (select(max_sd + 1, &readfds, NULL, NULL, NULL)

< 0) {

perror("Select error");

exit(EXIT_FAILURE);

}

// 处理主套接字,表示有新的连接

if (FD_ISSET(server_fd, &readfds)) {

if ((new_socket = accept(server_fd, (struct

sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {

perror("Accept error");

exit(EXIT_FAILURE);

}

// 输出新连接的信息

4 / 6

printf("New connection, socket fd is %d, ip

is: %s, port: %dn", new_socket,

inet_ntoa(_addr),

ntohs(_port));

// 添加新的连接到客户端套接字集合

for (int i = 0; i < max_clients; i++) {

if (client_sockets[i] == 0) {

client_sockets[i] = new_socket;

break;

}

}

}

// 处理客户端套接字,表示有数据可读

for (int i = 0; i < max_clients; i++) {

int sd = client_sockets[i];

if (FD_ISSET(sd, &readfds)) {

if (read(sd, buffer, sizeof(buffer)) ==

0) {

// 客户端断开连接

5 / 6

printf("Client disconnected, socket

fd is %dn", sd);

close(sd);

client_sockets[i] = 0;

} else {

// 处理客户端发送的数据

printf("Received from client, socket

fd is %d: %sn", sd, buffer);

// 这里可以添加处理接收数据的逻辑

}

}

}

}

return 0;

}

这个例子创建了一个简单的服务器,使用 select 函数同时监听主套接字和所有客户端套接字的可读性。当有新连接时,它将新连接添加到客户端套接字集合,并在有数据可读时处理客户端的数据。请注意,这只是一个基本的例子,实际中可能需要更多的错误处理和逻辑来满足特定的需求。

6 / 6


本文标签: 接字 客户端 处理 例子 数据