• 服务器端代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include <errno.h>
#include <sys/fcntl.h> typedef struct _CLIENT{
int fd;
struct sockaddr_in addr;
char recvbuf[];
}CLIENT_S; int main(int argc, char** argv){ int socketfd,new_fd;
CLIENT_S sock_list[];
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
struct timeval tv;
char recvbuf[];
int res;
int max;
int len,nbytes;
int port = ;
int i; for(i = ; i < ; i ++){
sock_list[i].fd = -;
} if((socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == ){
fprintf(stderr, "socket Error:%s\n\a", strerror(errno));
exit();
} //设置为非阻塞
if (fcntl(socketfd, F_SETFL, O_NONBLOCK) == -) {
fprintf(stderr, "fcntl Error:%s\n\a", strerror(errno));
exit();
} bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if((bind(socketfd, &server_addr, sizeof(server_addr))) == -){
fprintf(stderr, "bind Error:%s\n\a", strerror(errno));
exit();
} if(listen(socketfd, ) == -){
fprintf(stderr, "listen Error:%s\n\a", strerror(errno));
exit();
} sock_list[].fd = socketfd;
max = socketfd;
fd_set watchset;//select所需要的文件描述符
FD_ZERO(&watchset);
//将监听socket放入扫描集合
FD_SET(socketfd, &watchset); while(){
FD_ZERO(&watchset); FD_SET(socketfd, &watchset);
for(i = ; i < ; i ++){
if (sock_list[i].fd != -) {
FD_SET(sock_list[i].fd, &watchset);
}
} res = select(max + , &watchset, NULL, NULL, NULL); if(- == res){
fprintf(stderr, "select Error:%s\n\a", strerror(errno));
exit();
}else if( == res){
printf("Select() break and the return num is");
continue;
}else{
if(FD_ISSET(socketfd, &watchset)){
len = sizeof(struct sockaddr_in);
if ((new_fd = accept(socketfd,
(struct sockaddr *)&client_addr,
&len)) == -) {
fprintf(stderr, "Accept error:%s\n\a", strerror(errno));
exit();
} for(i = ; i < ; i ++){
if (sock_list[i].fd == -) {
sock_list[i].fd = new_fd;
sock_list[i].addr = client_addr;
break;
}
} fprintf(stderr, "new connect: %d\n", sock_list[i].fd); //将其放入socket的监听集合
FD_SET(new_fd, &watchset);
if (max < new_fd) {
max = new_fd;
} continue;
}else{
for (i = ; i < ; i++) { //data
if (sock_list[i].fd == -)
continue;
if (!FD_ISSET(sock_list[i].fd, &watchset)) {
continue;
} nbytes = recv(sock_list[i].fd, sock_list[i].recvbuf, sizeof(sock_list[i].recvbuf), );
recvbuf[nbytes] = '\0'; printf("recv data is:%s\n",sock_list[i].recvbuf); break;
}
}
}
}//while(1) exit();
}

Linux 网络编程(多路复用)的更多相关文章

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

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

  2. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  3. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  4. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  6. 《转》Linux网络编程入门

    原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...

  7. Linux网络编程(六)

    网络编程中,使用多路IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个套接口. 3.一个tcp服务程序既要处理监听套接口,又要处理 ...

  8. Linux网络编程(五)

    /*Linux网络编程(五)——多路IO复用之select() 网络编程中,使用IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个 ...

  9. Linux网络编程(四)

    在linux网络编程[1-3]中,我们编写的网络程序仅仅是为了了解网络编程的基本步骤,实际应用当中的网络程序并不会用那样的.首先,如果服务器需要处理高并发访问,通常不会使用linux网络编程(三)中那 ...

  10. linux 网络编程

    linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. ...

随机推荐

  1. tp框架简易导出数据库

    类库,将以下文件放入vendor文件夹中,命名空间vendor,使用think下的model类 <?php /** * 描述:基于ThinkPHP框架的Mysql数据库导出类 * 日期:2012 ...

  2. 清除WKWebView的缓存

    OC写法: swift写法再下下面. 清除WKWebView的缓存,让H5页面一刷新就更新至最新的页面 要区分iOS9.0和8.0两种 - (void)deleteWebCache { if ([[U ...

  3. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...

  4. 选择什么样的DOCTYPE

  5. linux 定时清理session

    php session 运营想让用户登陆网站就能永久保持登陆会话,感觉这是扯淡,因为视频播放1小时,所以我设置了两小时过期. 但是用户过多,导致session文件大量存储.产生上百万千万.服务器空间很 ...

  6. filter之排除个别过滤

    1.jsp 篇 一般拦截器设置都是拦截*.action.*.jsp等,如此我们可以扩展后缀名,逃过拦截: jsp的话,可以改成.jspf后缀. ( 把一个JSP文件命名为jspf扩展名,然后inclu ...

  7. 《CODE》读后笔记——第14~20章

    14.反馈与触发器 振荡器不需要人的干涉即可自主且不断地实现断开和闭合.所有计算机都靠某种振荡器来使其他部件同步工作. 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器.触发器具有记忆 ...

  8. php 使用 极光推送 类

    <?php /** * 安卓和苹果消息主推 */ class JPush extends CComponent { private $_push_body = array(); private ...

  9. Ubuntu MYSQL和Windows MYSQL (非C盘安装)

    1.Ubuntu 默认安装 Mysql 5.6版本以上: 1.查看系统是否安装mysql 数据库: sudo netstat -tap | grep mysql 如果安装了,就查看一下版本命令: my ...

  10. DBCP配置数据库连接乱码问题

    driverClassName = com.mysql.jdbc.Driver url = jdbc:mysql:///bigdata username = root password = 82371 ...