动态数组的实现与前面代码相同,下面是主函数

#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函数相关推荐

  1. IO多路转接 ——— select、poll、epoll

    文章目录 I/O多路转接之select select初识 select函数 socket就绪条件 select基本工作流程 select服务器 select的优点 select的缺点 select的适 ...

  2. epoll(eventpoll)是干嘛的?IO多路转接技术(相较select、poll的优点)

    首先我们要知道epoll是用来干什么的(定义):epoll是一种IO多路转接技术,在LINUX网络编程中,经常用来做事件触发,即当有特定事件到来时,能够检测到,而不必阻塞进行监听,基于事件驱动的IO多 ...

  3. Linux下I/O多路转接之select --fd_set

    fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...

  4. IO多路转接模型----(select的模型,select的优缺点,poll的模型,poll的优缺点)

    IO多路转接模型:select/poll/epoll 对大量描述符进行事件监控(可读/可写/异常) select模型 用户定义描述符的事件监控集合 fd_set(这是一个位图,用于存储要监控的描述符) ...

  5. 网络编程(三)TCP IO多路转接服务器编程(select)

    同系列文章: 1, 文章目录 一,select知识引入 二,select基本概念 2.1 select概念理解前先总结一下通信过程(便于后文理解select) 2.2 select函数的用法 2.2. ...

  6. select poll epoll 高效IO 多路转接

    目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...

  7. IO多路转接之epoll

    IO多路转接之epoll 文章目录 IO多路转接之epoll 一.epool 二.基于epoll实现服务器(LT) 三.**基于epoll实现服务器(LT)** 一.epool 是为处理大批量句柄而作 ...

  8. IO多路转接模型-----epoll

    epoll: Linux下性能最高的多路转接模型 epoll 有3个相关的系统调用. epoll_create 功能:创建epoll,在内核中创建eventpoll结构体,size决定了epoll最多 ...

  9. 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)

    高级IO: 五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型:select/poll/epoll 五种典型IO 阻塞IO IO操作的流程:等待IO操作条件具 ...

最新文章

  1. a.ou、coff、elf三种文件格式
  2. 惜分飞oracle,惜分飞 - 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 13429648788...
  3. Storm教程1理论介绍
  4. android 调用系统下载apk,如何在自己的App中调用Android系统自带的安装/卸载程序...
  5. springboot配置单独的参数文件
  6. win10无限重启_win10系统安装无限循环如何解决_win10教程
  7. vue点击ul中的li显示,点击其他地方隐藏
  8. 两个数相乘积一定比每个因数都大_两个多位数相乘,积一定比每一个因数都大。[ ]...
  9. 一些值得注意的算法题——哈希表
  10. 《海量数据库解决方案》之位图索引的结构和特征
  11. 如何使用代码获取电脑内存_代码实战 | 如何在 Android 开发中使用协程
  12. linux centos7 下ruby 下载安装
  13. python中实现如何强制删除非空文件夹
  14. Python.PyAutoGUI.利用手机模拟器破解Yousee密码
  15. 详解DFT的scan(边界扫描)
  16. [论文阅读笔记]DeepFool: a simple and accurate method to fool deep neural networks
  17. 《辛德勒的名单》观后感
  18. 【租房合同】2017北京市房屋租赁合同(自行成交版).doc
  19. MMO 游戏服务器引擎设计
  20. Catagory基础使用

热门文章

  1. GNVM版本下载太慢用淘宝镜像速度提百倍哈
  2. 远程--不用关闭防火墙,也可以远程连接(远程桌面连接不上怎么办)
  3. STC51单片机数码管显示程序和仿真
  4. [转]建行B2B支付回调参数乱码现象解析
  5. JAVA运行时中文输出乱码原因与解决
  6. 常见的5种网站页面布局方式及特点分析
  7. 做汽车工程师需要哪些计算机语言,做好汽车研发工程师,需要懂哪些?
  8. 剑网3哪5区人哪个服务器最多,剑网3哪个区服人最多?只有选对了游戏区才能体会到多人的乐趣...
  9. R语言 Matrix的使用
  10. 【天光学术】舞蹈论文:生本理念下多媒体技术在舞蹈教学中的运用(节选)