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
版权声明:本文标题:linux socket select 例子 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1703204354h442155.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论