#include <stdio.h>
#include <time.h>
#include <sys/select.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void)
{
time_t s = time(0);
fd_set rfs;
FD_ZERO(&rfs);
FD_SET(STDIN_FILENO, &rfs);
while(1){
char str[100] = "";
fd_set set = rfs; //拷贝一份
struct timeval t = {};
t.tv_sec = 0; //秒
t.tv_usec = 100000; //毫秒
if(select(STDIN_FILENO + 1, &set, NULL, NULL, &t) > 0){//有多少个准备好了
scanf("%s", str);
printf("resp : %s\n", str);
}
time_t e = time(0);
if(e > s){
printf("helloworld\n");
s = e;
}
}
return 0;
}
//select 内部是一个变量 ,1024 bit,128字节,32个整形,1024个标志位。0-1023;
//poll 数组
//epoll 二叉树
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <signal.h>
static char loop = 1;
void sig_handler(int sigid)
{
if(sigid == SIGINT) loop = 0;
}
int main(void)
{
signal(SIGINT, sig_handler);
// 1. 搭建服务器
// 创建套接字
int serverfd = socket(AF_INET, SOCK_STREAM, 0);
if(serverfd < 0){
perror("create socket failed; ");
return -1;
}
// 绑定套接字
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(22222);
socklen_t server_len = sizeof(server_addr);
if(bind(serverfd, (const struct soctaddr*)&server_addr, server_len) < 0){
perror("bind socket failed; ");
return -1;
}
// 监听套接字
if(listen(serverfd, 5) < 0){
perror("listen failed; ");
return -1;
}
struct sockaddr_in client_addr;
socklen_t client_len;
fd_set rfs;
FD_ZERO(&rfs);
FD_SET(serverfd, &rfs);
// 接受套接字
while(loop){
fd_set set = rfs;
int res = select(1024, &set, NULL, NULL, NULL);
if(res <= 0) continue;
for(int i = 3; i < 1024 && res > 0; ++i){
if(FD_ISSET(i, &set)){
--res;
if(i == serverfd){
int clientfd = accept(serverfd, &(struct sockaddr*)&client_addr, &client_len);
if(clientfd > 0){
FD_SET(clientfd, &rfs);
}
}else{
char buffer[65536] = "";
int len = recv(i, buffer, sizeof(buffer), 0);
if(len <= 0){
// 断开
close(i);
FD_CLR(i, &rfs); //
}
}
}
}
}
// 回收
close(serverfd);
return 0;
}
IO多路复用
于 2021-07-11 22:39:09 首次发布