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 set
FD_ZERO(&clientfdset);
FD_SET(server_socket, &clientfdset);
// timeout setting
tv.tv_sec = 15;
tv.tv_usec = 0;
// add active connection to fd set
for (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 set
for (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):向文件描述符集合中删除一个文件描述符

 
 

【Socket】linux网络多路复用IO技术的更多相关文章

  1. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  2. linux网络编程 IO多路复用 select epoll

    本文以我的小型聊天室为例,对于服务器端的代码,做了三次改进,我将分别介绍阻塞式IO,select,epoll . 一:阻塞式IO 对于聊天室这种程序,我们最容易想到的是在服务器端accept之后,然后 ...

  3. [转载] Linux下多路复用IO接口 epoll select poll 的区别

    原地址:http://bbs.linuxpk.com/thread-43628-1-1.html 废话不多说,一下是本人学习nginx 的时候总结的一些资料,比较乱,但看完后细细揣摩一下应该就弄明白区 ...

  4. linux网络编程IO模型

    同步与异步:         同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成.         异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要 ...

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

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

  6. LINUX网络编程 IO 复用

    参考<linux高性能服务器编程> LINUX下处理多个连接时候,仅仅使用多线程和原始socket函数,效率十分低下 于是就出现了selelct poll  epoll等IO复用函数. 这 ...

  7. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  8. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

  9. Socket网络编程-IO各种概念及多路复用

    Socket网络编程-IO各种概念及多路复用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统相关知识 1>.同步和异步  函数或方法被调用的时候,调用者是否得到最 ...

随机推荐

  1. iteye-Spring的缺点有哪些

    http://www.iteye.com/topic/1126929 1. flounders --  发表时间:2012-09-25    如题,希望大侠们指出,不能用Spring就觉得他什么都好, ...

  2. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)

    好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...

  3. Weex学习与实践

    Weex学习与实践(一):Weex,你需要知道的事 本文主要介绍包括Weex基本介绍.Weex源码结构.初始化工程.we代码结构.Weex的生命周期.Weex的工作原理.页面间通信.boxmodel ...

  4. Xcode 常用调试技巧总结

    NSLog,po命令和普通断点调试相信每个iOS开发者都会,这里就不作介绍了. 一.Memory Graph Xcode8新增:Memory Graph解决闭包引用循环问题 有很多叹号说明就有问题了. ...

  5. NFS安装及优化过程--centos6.6

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. Vue.js hello world

    <!DOCTYPE HTML> <html> <head> <title>vue.js hello world</title> <sc ...

  7. 使用itext直接替换PDF中的文本

    直接说问题,itext没有直接提供替换PDF中文本的接口(查看资料得到的结论是PDF不支持这种操作),不过存在解决思路:在需要替换的文本上覆盖新的文本.按照这个思路我们需要解决以下几个问题: itex ...

  8. 【JavaScript】浅析IIFE(立即执行函数表达式)的作用

    什么是IIFE IIFE就是立即执行函数表达式(Immediately-Invoked Function Expression) 为什么需要IIFE 应用IIFE有两个比较经典的使用场景, 第一就是在 ...

  9. 跟我学SharePoint 2013视频培训课程——理解SharePoint网站的体系结构(3)

    课程简介 第三天,理解SharePoint 2013 网站的体系结构 视频 SharePoint 2013 交流群 41032413

  10. SharePoint 2013 Step by Step—— 为终端用户提供故障恢复的解决方案 Part I

    Disaster Recovery,我把他直译"故障恢复",或者也可以翻译成 "灾难复原 ".光字面意思就可以领会到,当SharePoint Server发生了 ...