1.mystery引入

 

   1)Select是一种多路复用IO输入输出模式,在linux的输入输出编程中通过select的轮询机制,发现可用/可读或可写的接口。
   2)低级socket程序中有一个共同点:都是基于阻塞式的编程方式
   3)非阻塞式是函数调用时不阻塞,不管函数执行成功与否,都会立即返回。
   4)优点:程序效率提升
   5)缺点:返回的结果往往是错误的类型码
   6)解决方案:Select机制。


2.实例操

 

1)基于Select模式实现一个网络echo的服务程序,即客户端向服务端发送信息,服务器接收到信息后,再将信息原样转发给客户端
   2)需要设置Select函数
   3)若当前有新连接,则加入到客户端套接字集合,若数量过载,则断开本次连接,并发送提示信息:sorry overload
   4)源代码

//selectsocket.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_PORT 5555
#define QUEUE_LENGTH 5
#define BUF_SIZE 200
int main(void)
{int server_socket, new_socket;struct sockaddr_in server_addr;  struct sockaddr_in client_addr;socklen_t sin_size;int client_socket[QUEUE_LENGTH];  int conn_num;  int yes = 1;char buf[BUF_SIZE];int ret;int i;if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 0;}if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1){perror("setsockopt");return 0;}server_addr.sin_family = AF_INET;       server_addr.sin_port = htons(SERVER_PORT);   server_addr.sin_addr.s_addr = INADDR_ANY;memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero));if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){perror("bind");return 0;}if (listen(server_socket, 5) == -1){perror("listen");return 0;}printf("listen port %d\n", SERVER_PORT);fd_set clientfdset;int maxsock;struct timeval tv;conn_num = 0;sin_size = sizeof(client_addr);maxsock = server_socket;while (1){// initialize file descriptor setFD_ZERO(&clientfdset);FD_SET(server_socket, &clientfdset);// timeout settingtv.tv_sec = 15;tv.tv_usec = 0;// add active connection to fd setfor (i = 0; i < QUEUE_LENGTH; i++){if (client_socket[i] != 0){FD_SET(client_socket[i], &clientfdset);}}ret = select(maxsock + 1, &clientfdset, NULL, NULL, &tv);if (ret < 0){perror("select");break;}else if (ret == 0){printf("waitting timeout\n");continue;}// check every fd in the setfor (i = 0; i < conn_num; i++){if (FD_ISSET(client_socket[i], &clientfdset)){ret = recv(client_socket[i], buf, sizeof(buf), 0);if (ret <= 0){      printf("client[%d] close\n", i);close(client_socket[i]);FD_CLR(client_socket[i], &clientfdset);client_socket[i] = 0;}else{   printf("Client[%d] msg:%s\n", i, buf);send(client_socket[i], buf, sizeof(buf), 0);}}}if (FD_ISSET(server_socket, &clientfdset)){new_socket = accept(server_socket, (struct sockaddr *)&client_addr, &sin_size);if (new_socket <= 0){perror("accept");continue;}if (conn_num < QUEUE_LENGTH){client_socket[conn_num++] = new_socket;printf("new client[%d] %s:%d\n", conn_num,inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));if (new_socket > maxsock)maxsock = new_socket;}else{send(new_socket, "sorry overload!", sizeof("sorry overload!"), 0);close(new_socket);break;}}}for (i = 0; i < QUEUE_LENGTH; i++){if (client_socket[i] != 0){close(client_socket[i]);}}
}

3.mystery注

 

1)设置高级socket属性参数中的应用参数SO_REUSERADDR,实现地址的可重复利用
   2)FD_SET(int fd, fd_set *fdset):向文件描述符集合中增加一个新的文件描述符

3)FD_CLR(int fd, fd_set *fdset):向文件描述符集合中删除一个文件描述符

转载于:https://www.cnblogs.com/lcw/p/3159512.html

【Socket】linux网络多路复用IO技术相关推荐

  1. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

  2. Linux网络编程(IO多路复用)

    网络编程 1 操作系统 1.1 用户空间与内核空间 1.2 进程切换 1.3 进程的阻塞 1.4 文件描述符fd 2 IO多路复用 2.1 阻塞IO 2.1.1 多线程/多进程 2.1.2 线程池 2 ...

  3. Linux下多路复用IO接口epoll/select/poll的区别

    select比epoll效率差的原因:select是轮询,epoll是触发式的,所以效率高. Select: 1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认 ...

  4. linux网络编程socket,Linux网络编程入门

    socket又叫做套接字,网络编程又叫做套接字编程.而socket地址也称为套接字地址,可以理解为计算机的网络地址. 1.理解socket地址 假设小明同学想给女神打电话需要知道对方的电话号码才能继续 ...

  5. C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)

    目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...

  6. 【Linux网络编程学习】I/O多路复用——epoll

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 关于epoll epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活 ...

  7. Linux网络编程(六)-高并发服务器03-I/O多路复用03:epoll【红黑树;根节点为监听节点】【无宏FD_SETSIZE限制;不需每次都将要监听的文件描述符从应用层拷贝到内核;不需遍历树】

    一.epoll概述 epoll的本质是一个[红黑树].监听结点为根节点. 大量并发,少量活跃效率高. epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并 ...

  8. Linux网络IO模型及JAVA中IO模型

    文章目录 1.概述 2.Linux网络IO模型 2.1.阻塞IO模型 2.2.非阻塞IO模型 2.3.IO复用模型 2.3.1.select 2.3.2.poll 2.3.3.epoll 2.4.信号 ...

  9. Redis网络多路IO复用以及底层原理

    老早听说过Redis是单线程,但指的是什么单线程,为什么单线程,底层实现原理是什么? 单线程指的是Redis中处理网络请求的模块是单线程处理的,并非指整一个Redis软件都是单线程,肯定有其它线程做其 ...

最新文章

  1. html xhtml and css,HTML与XHTML的重要区别
  2. Linux系统主要目录及作用
  3. 域控制器显示无法使用解决办法
  4. 【超高效代码】1059 C语言竞赛 (20分)
  5. 使用Forge,WildFly Swarm和Arquillian开发微服务
  6. mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况
  7. 用HTML制作表单表格能学到什么,Html学习之十七(表格与表单学习--排行版制作)...
  8. flask 接口上传文件_Flask干货:Flask数据交换——上传文件
  9. 使用PIL库使用文本生成图片(类验证码)
  10. 基于C++/Qt带有界面的四则运算生成程序
  11. PHP执行耗时脚本实时输出内容
  12. 09月27日 pytorch与resnet(二)
  13. android qq毛玻璃,如何快速做出毛玻璃背景?有了这个网格渐变神器,1分钟搞定...
  14. java开发面试 自我介绍!!!!!
  15. 演讲的思路锻炼,逆向思维需要刻意练习吗?
  16. 基于AM437x的FPGA与ARM通信测试
  17. 户外蓝牙小音箱值得买
  18. 编码 GBK 的不可映射字符——【java菜鸟成长记】
  19. JS学习--用JS读取本地文件
  20. Compensating-Transaction模式

热门文章

  1. 《苏醒之路》制作人王鲲:独立游戏如何成功出海?
  2. java jdbc数据库五种连接方式
  3. 关于MySQL建表对DML的影响
  4. The requested URL /nagios/cgi-bin/statusmap.cgi was not found on this server
  5. ORACLE包和过程依赖关系测试
  6. Jmeter5.1.1第一个http请求的压力测试
  7. webpack中跨域请求proxy代理(vue与react脚手架不同设置方法)
  8. [转帖]TLS 版本问题
  9. 关于编辑器对input标签报错提示“表单输入没有相关label”的问题
  10. iOS 控制屏幕横竖屏旋转