Linux 网络编程(多路复用)
- 服务器端代码
#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 网络编程(多路复用)的更多相关文章
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 《转》Linux网络编程入门
原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...
- Linux网络编程(六)
网络编程中,使用多路IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个套接口. 3.一个tcp服务程序既要处理监听套接口,又要处理 ...
- Linux网络编程(五)
/*Linux网络编程(五)——多路IO复用之select() 网络编程中,使用IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个 ...
- Linux网络编程(四)
在linux网络编程[1-3]中,我们编写的网络程序仅仅是为了了解网络编程的基本步骤,实际应用当中的网络程序并不会用那样的.首先,如果服务器需要处理高并发访问,通常不会使用linux网络编程(三)中那 ...
- linux 网络编程
linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. ...
随机推荐
- Asp.Net MVC4入门指南(5):从控制器访问数据模型
在本节中,您将创建一个新的MoviesController类,并在这个Controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里. 在开始下一步前,先Build一下应用程序(生 ...
- Iscroll解析
做了一些移动端的产品,发现一些滚动效果很多会使用 iscroll 作为底层库(如阿里小蜜).iscroll 的文档已经好久没更新了,而且比较简单,经常需要直接读源码.这里写一篇总结,作为对 iscro ...
- 证书过期-->app审核提示90034证书错误
1.证书过期问题,去钥匙串中删除过期证书,然后新下载一个证书,重新添加,注:一定要把所有过期证书全部删除,如果不显示则点击钥匙串-->显示过期证书 然后下载新证书:https://develop ...
- WampServer3.0.4 允许外网访问配置教程
原文地址:http://jingyan.baidu.com/album/acf728fd556c93f8e410a344.html?picindex=1
- ros学习笔记 - 深度传感器转换成激光数据(hector_slam)
前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...
- Linux系统简介
1.操作系统包括 系统调用.内核. Linux 也就是系统调用和内核那两层,当然直观的来看,我们使用的操作系统还包含一些在 其上运行的应用程序,比如文本编辑器,浏览器,电子邮件. 2.Linux 本身 ...
- Object 转化为String时的一个问题 null->"null"
近日在工作出了一个较大的问题,导致被客户投诉. 事情大致是,某个功能里新增对用户手机的修改,在平台数据同步过程中,出现了将用户以前的要同步的数据,那时还没有手机号码所以是null,新功能上线后,将手机 ...
- flashftp连接虚拟机centos报错的解决方法
flashftp连接虚拟机centos报错,一般情况可能是因为端口(22)的权限没有开放 先在centos中检查并开放22端口,执行:iptables -I INPUT -p tcp --dport ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- btn-default
Bootstrap 还有一种属于按钮的 class 属性叫做btn-default . to