Linux C语言IO多路转接select函数
动态数组的实现与前面代码相同,下面是主函数
#include <netdb.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
#include <signal.h>
#include <time.h>
#include <errno.h>
#include <pthread.h>
#include <fcntl.h>
#include "vector_fd.h"VectorFD *vfd;
int sockfd;void sig_handler(int signo)
{if(signo == SIGINT){printf("server close\n");close(sockfd);destory_vector_fd(vfd);exit(1);}}void out_addr(struct sockaddr_in *clientaddr)
{int port = ntohs(clientaddr->sin_port);char ip[16];memset(ip,0,sizeof(ip));inet_ntop(AF_INET, &clientaddr->sin_addr.s_addr, ip, sizeof(ip));printf("client: %s(%d) connected\n", ip, port);
}void do_service(int fd)
{char buff[512];memset(buff,0,sizeof(buff));size_t size = read(fd, buff, sizeof(buff));if(size==0){char info[] = "client closed";write(STDOUT_FILENO,info,sizeof(info));remove_(vfd,fd);close(fd);}else if(size >0){write(STDOUT_FILENO,buff,sizeof(buff));if(write(fd, buff, size)<0){if(errno == EPIPE){perror("write error");remove_(vfd, fd);close(fd);}perror("protocal error");}}}void* th_fn(void *arg)
{int i;while(1){for(i=0;i<vfd->counter;i++){do_service(get_fd(vfd,i));}}return (void*)0;
}int main(int argc, char *argv[])
{if(argc<2){printf("usage: %s #port\n", argv[0]);exit(1);}if(signal(SIGINT, sig_handler) == SIG_ERR){perror("signal sigint error");exit(1);}// AF_INET: IPV4// SOCK_STREAM: tcpsockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error");exit(1);}struct sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[1]));serveraddr.sin_addr.s_addr = INADDR_ANY;if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0) {perror("bind error");exit(1);}if(listen(sockfd,10) <0){perror("listen error");exit(1);}struct sockaddr_in clientaddr;socklen_t clientaddr_len = sizeof(clientaddr);// create dynamic arrayvfd = create_vector_fd();// pthread_tpthread_t th;pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);int err;if((err = pthread_create(&th, &attr,th_fn,(void*)0))!=0){perror("pthread create error");exit(1);}pthread_attr_destroy(&attr);while(1){int fd = accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);if(fd<0){perror("accept error");continue;}out_addr(&clientaddr);// unblockint val;fcntl(fd, F_GETFL, &val);val |= O_NONBLOCK;fcntl(fd, F_SETFL, val);// socket fd add dynimic arrayadd_fd(vfd, fd);}return 0;}
Linux C语言IO多路转接select函数相关推荐
- IO多路转接 ——— select、poll、epoll
文章目录 I/O多路转接之select select初识 select函数 socket就绪条件 select基本工作流程 select服务器 select的优点 select的缺点 select的适 ...
- epoll(eventpoll)是干嘛的?IO多路转接技术(相较select、poll的优点)
首先我们要知道epoll是用来干什么的(定义):epoll是一种IO多路转接技术,在LINUX网络编程中,经常用来做事件触发,即当有特定事件到来时,能够检测到,而不必阻塞进行监听,基于事件驱动的IO多 ...
- Linux下I/O多路转接之select --fd_set
fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...
- IO多路转接模型----(select的模型,select的优缺点,poll的模型,poll的优缺点)
IO多路转接模型:select/poll/epoll 对大量描述符进行事件监控(可读/可写/异常) select模型 用户定义描述符的事件监控集合 fd_set(这是一个位图,用于存储要监控的描述符) ...
- 网络编程(三)TCP IO多路转接服务器编程(select)
同系列文章: 1, 文章目录 一,select知识引入 二,select基本概念 2.1 select概念理解前先总结一下通信过程(便于后文理解select) 2.2 select函数的用法 2.2. ...
- select poll epoll 高效IO 多路转接
目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...
- IO多路转接之epoll
IO多路转接之epoll 文章目录 IO多路转接之epoll 一.epool 二.基于epoll实现服务器(LT) 三.**基于epoll实现服务器(LT)** 一.epool 是为处理大批量句柄而作 ...
- IO多路转接模型-----epoll
epoll: Linux下性能最高的多路转接模型 epoll 有3个相关的系统调用. epoll_create 功能:创建epoll,在内核中创建eventpoll结构体,size决定了epoll最多 ...
- 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)
高级IO: 五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型:select/poll/epoll 五种典型IO 阻塞IO IO操作的流程:等待IO操作条件具 ...
最新文章
- a.ou、coff、elf三种文件格式
- 惜分飞oracle,惜分飞 - 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 13429648788...
- Storm教程1理论介绍
- android 调用系统下载apk,如何在自己的App中调用Android系统自带的安装/卸载程序...
- springboot配置单独的参数文件
- win10无限重启_win10系统安装无限循环如何解决_win10教程
- vue点击ul中的li显示,点击其他地方隐藏
- 两个数相乘积一定比每个因数都大_两个多位数相乘,积一定比每一个因数都大。[ ]...
- 一些值得注意的算法题——哈希表
- 《海量数据库解决方案》之位图索引的结构和特征
- 如何使用代码获取电脑内存_代码实战 | 如何在 Android 开发中使用协程
- linux centos7 下ruby 下载安装
- python中实现如何强制删除非空文件夹
- Python.PyAutoGUI.利用手机模拟器破解Yousee密码
- 详解DFT的scan(边界扫描)
- [论文阅读笔记]DeepFool: a simple and accurate method to fool deep neural networks
- 《辛德勒的名单》观后感
- 【租房合同】2017北京市房屋租赁合同(自行成交版).doc
- MMO 游戏服务器引擎设计
- Catagory基础使用
热门文章
- GNVM版本下载太慢用淘宝镜像速度提百倍哈
- 远程--不用关闭防火墙,也可以远程连接(远程桌面连接不上怎么办)
- STC51单片机数码管显示程序和仿真
- [转]建行B2B支付回调参数乱码现象解析
- JAVA运行时中文输出乱码原因与解决
- 常见的5种网站页面布局方式及特点分析
- 做汽车工程师需要哪些计算机语言,做好汽车研发工程师,需要懂哪些?
- 剑网3哪5区人哪个服务器最多,剑网3哪个区服人最多?只有选对了游戏区才能体会到多人的乐趣...
- R语言 Matrix的使用
- 【天光学术】舞蹈论文:生本理念下多媒体技术在舞蹈教学中的运用(节选)