io模型:

  同步IO: 阻塞形式,非阻塞形式(轮询)、信号驱动IO、IO复用(select, poll, epoll);

  异步io:aio_read()

典型场景:

  1、客户端处理多种IO-------标准io 和网络io(套接字)

  2、server端既要处理监听套接字又要处理已连接的套接字

  3、一个服务器要处理TCP,又要处理UDP

  4、server端要处理多种服务多个协议;

  5、不管是网络套接字还是文件读写描述符均可处理;

 #include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> #include <netinet/in.h>
#include <sys/socket.h>
#include <string.h> //bzero() int main()
{
int socketfd;
struct sockaddr_in serv_addr;    //struct socket address internet
int i =;
/** /usr/include/netinet/in.h
* #define __SOCKADDR_COMMON(sa_prefix) \
* sa_family_t sa_prefix##family)
*
* struct sockaddr_in{
* _SOCKADDR_COMMON(sin_); //展开宏sa_family_t sin_family
* int_port_t sin_port;
* struct in_addr sin_addr;
* }
*accept默认会阻塞进程,直到有一个客户连接建立后返回,
*它返回的是一个新可用的套接字,这个套接字是连接套接字。
*此时我们需要区分两种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,
*在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;
*而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。
*在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;
*而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。
*自然要问的是:为什么要有两种套接字?原因很简单,如果使用一个描述字的话,
*那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的描述字.
*/
//struct sockaddr_in serv_addr;
//address family, socket_stream, 0:会自动选择type类型对应的默认协议
socketfd = socket(AF_INET,SOCK_STREAM, );
if(socketfd){ } bzero((char*)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET; //主机字节序
serv_addr.sin_port = htons(); //网络字节序
serv_addr.sin_addr.s_addr =htonl(INADDR_ANY); //监听所有地址 if(bind(socketfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))){ } listen(socketfd, ); int maxfd;
fd_set allset, rset;
maxfd = socketfd; FD_ZERO(&allset); //将allset清零,使得集合中不含任何fd
FD_SET(socketfd, &allset); //将socketfd加入allset集合 int sockfd, clilen, bytes;
struct sockaddr_in cli_addr;
char buffer[]; while(){
rset = allset;
       /*select第一个参数表示要检查的文件描述符的个数;比如最大值为5,因为
       *文件描述符是从0开始的,所以需要检查0,1,2,3,4,5这六个值;即最大值+1;
       */
if(select(maxfd+, &rset, NULL, NULL, NULL)){ } for(i=; i<=maxfd; i++){
if(FD_ISSET(i, &rset)){ //一个个来判断是否被置位了
if(socketfd == i){ //监听套接字
clilen = sizeof(cli_addr);
sockfd = accept(socketfd, (struct sockaddr*)&cli_addr, (socklen_t*)&clilen);
if(sockfd<){ //error
perror("accept error \n");
}
FD_CLR(i, &rset); //清零
maxfd = maxfd>sockfd?maxfd:sockfd;
FD_SET(sockfd, &allset); }else{ //通信套接字
bzero(buffer, );
bytes = recv(i, buffer, , );
if(bytes <= ){ //client端退出
FD_CLR(i, &allset); //清零
close(i);
continue;
}
printf("recv msg: %s", buffer);
send(i, buffer, , );
}
}
}
} return ;
}

linux select 网络模型的更多相关文章

  1. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例

    除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...

  2. linux—select具体解释

    linux—select具体解释 select系统调用时用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变. 关于文件句柄,事 ...

  3. Linux Select之坑

    最近在写一个demo程序,调用select()来监听socket状态,流程如下: r_set 初始化 timeout 初始化3秒超时 loop{ select(ntfs, &r_set, nu ...

  4. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】

    转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnb ...

  5. linux select函数详解

    linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...

  6. Linux select 机制深入分析

    Linux select 机制深入分析            作为IO复用的实现方式.select是提高了抽象和batch处理的级别,不是传统方式那样堵塞在真正IO读写的系统调用上.而是堵塞在sele ...

  7. Linux select TCP并发服务器与客户端编程

    介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...

  8. Linux select I/O 复用

    用途 在处理多个socket套接字的时候,会很自然的遇到一个问题:某个套接字什么时候可读?什么时候可写?哪些套接字是需要关闭的?我们可以回忆一下,一般我们在最开始编写socket程序的时候,send, ...

  9. select网络模型知识总结

    select模型支持IO多路复用,select函数如下 int select ( IN int nfds, //windows下无意义,linux有意义 IN OUT fd_set* readfds, ...

随机推荐

  1. XML实例入门2

    工具:notepad++.VS2008(MSXML6.0) 来自msdn的例子(经过修改,因为升级到MSXML6.0,有些关键字不太一样了), 需要文件books.xml,books.vsd(博客只支 ...

  2. linux的nohup命令的用法。

    在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会 用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/m ...

  3. WINDOWS硬件通知应用程序的常方法(五种方式:异步过程调用APC,事件方式VxD,消息方式,异步I/O方式,事件方式WDM)

    摘要:在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口.为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,并 ...

  4. 继承CWnd自绘按钮

    头文件: //头文件 #pragma once // CLhsButton #define MYWM_BTN_CLICK WM_USER+3001 //关闭按钮单击响应 //tab按钮的状态 enum ...

  5. _sortBy用法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. ubuntu13.04安装SenchaArchitect-2.2无法启动的问题

    系统是ubuntukylin-13.04-desktop版本,不知道别的版本有没有这个问题,未测试.SenchaArchitect采用最新版本2.2.2,我安装的是32位的. 具体无法启动的问题如下: ...

  7. 数据结构中La表的数据合并到Lb表中

    实验描述:La表中的数据为(3,5,8,11)  Lb 表中的数据为(2,6,8,9,11,15,20) 将La表中的数据而不存在Lb表的数据插入到Lb表中,从而实现并集操作. 出现的问题:最后实现的 ...

  8. NSJSONSerialization(category)的一个扩展类

    .h文件 // // NSJSONSerialization+Manage.h // SVPullToRefreshDemo // // Created by Fuer on 14-7-4. // C ...

  9. _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  10. linux下查看文件内容cat,more,less

    1. 查看文件内容经常使用的命令 cat : 由第一行显示文件内容 tac:  从最后一行開始显示.与cat相反 nl :  文件内容和行号一起输出 more: 一页一页显示 less: 与more类 ...