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模型中传输层一层中的两个不同的通信协议. ...
随机推荐
- 2-3. Using Type Deduction
Type Deduction 发生在编译时期 可以对一般类型,自定义类型进行类型自推导 下面有两个例子: 1. Using auto with a class #include <iostrea ...
- ue4 FPaths各目录
GetWrappedLaunchDir() 启动时的工作目录,因为马上要把工作目录改为下面所说的exe所在目录,所以会先把当前的缓存起来 FPlatformProcess::BaseDir() 这个是 ...
- javascript学习第四课函数
函数也是一种数据类型:function类型 所以函数也可当作一个数据作参数传递 三种函数的声明示例: 一般来讲,声明方式一和声明方式二比较常用,方式三比较少. 常用函数方式示例: 注意:虽然函数支持嵌 ...
- 无域环境下,VCENTER5.5 更改IP后 无法登陆异常修复
转自http://bbs.vmsky.com/forum.php?mod=viewthread&tid=45593&highlight=vcenter%2Bip 由于没有域环境,SSO ...
- zend studio常用快捷键
1.提示符助手快捷键 alt+/ 你可以自定义 window->keys->Content assist->Binding 2.复制当前行 alt+ctrl+下 3.删除 ctrl+ ...
- MvcPager 免费开源分页控件3.0版发布!
MvcPager 3.0版在原2.0版的基础上进行了较大的升级,对MvcPager脚本插件重写并进行了大量优化.修复了部分bug并新增了客户端Javascript API等功能,使用更方便,功能更强大 ...
- ros问题总结
1.-- package 'orocos-bfl' not found CMake Error at /usr/share/cmake-2.8/Modules/FindPkgConfig.cmake: ...
- while语句
<?php $num=10;//被除数 $cs=2; $str=""; while ($num !=0) { $ys=$num % $cs ...
- openjudge2985(数字组合)
描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如:n=5,5个数分别为1,2,3,4,5,t=5:那么可能的组合有5=1+4和5=2+3和5=5三种组合方式.输入输入的第一行是两 ...
- 编译gtk+程序报错gcc: pkg-config --cflags --libs gtk+-2.0: 没有那个文件或目录
第一次接触gtk+.在网上搜罗良一番,装好相应的库后,编写了第一hello程序.在编译时输入以下命令:gcc -o hello hello.c 'pkg-config --cflags --libs ...