实现Linux select IO复用C/S服务器代码
已在ubuntu 下验证可用
服务器端
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<arpa/inet.h>
#include <sys/select.h>
#define MAXBUF 256
#define MAXLISTEN 8
#define PORT 8888
struct msgtemp
{
int num;
char *s;
};
int main()
{
int clen,dirnum,opt=1,i,nbyte;
int listenfd,clientfd,maxfd;
int client[FD_SETSIZE];
struct sockaddr_in client_addr,server_addr;
char readbuf[MAXBUF],writebuf[MAXBUF];
struct msgtemp msg[FD_SETSIZE];
fd_set rset, allset;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket error:");
exit(1);
}
clen = sizeof(client_addr);
bzero(&server_addr,0);
server_addr.sin_family =AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(PORT);
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt));
if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){
perror("bind error");
exit(1);
}
if(listen(listenfd,MAXLISTEN)<0){
perror("listen error:");
exit(1);
}
maxfd = listenfd;
for (i = 0; i < FD_SETSIZE; i++)
client[i] = -1;
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
while(1){
rset = allset;
if(select(maxfd+1, &rset, NULL, NULL, NULL)<0)
{
perror("select");
return -1;
}
if (FD_ISSET(listenfd, &rset)) { /* 是否有新的连接进来*/
clientfd=accept(listenfd,(struct sockaddr *)&client_addr,&clen);
if(clientfd < 0)
{
perror("accept");
}
printf("new connection fd = %d\n",clientfd);
FD_SET(clientfd, &allset);
maxfd = clientfd > maxfd ? clientfd : maxfd;
for (i = 0; i < FD_SETSIZE; i++)
if (client[i] < 0) {
client[i] = clientfd;
break;
}
}
for (i = 0; i < FD_SETSIZE; i++)
{
if (FD_ISSET(client[i], &rset)) {
if ( (nbyte = read(client[i], readbuf, MAXBUF)) < 0) {
perror("read");
continue;
}
else if (nbyte ==0)
{
close(client[i]);
FD_CLR(client[i], &allset);
printf("connection fd = %d closed\n",client[i]);
client[i] = -1;
msg[i].num =0;
msg[i].s = NULL;
}
else{
printf("recv msg from fd = %d : %s\n",client[i],readbuf);
msg[i].s = readbuf;
sprintf(writebuf,"%03d : %s",msg[i].num,msg[i].s);
write(client[i], writebuf, strlen(writebuf)+1);
msg[i].num ++;
}
}
}
}
return 0;
}
客户端
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<arpa/inet.h>
#include<fcntl.h>
#define MAXBUF 256
#define PORT 8888
int main()
{
int ssock;
int clen,readbytes,fd2,i;
struct sockaddr_in server_addr;
char writebuf[MAXBUF],readbuf[MAXBUF],file_path[MAXBUF];
if((ssock=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket error:");
exit(1);
}
clen = sizeof(server_addr);
bzero(&server_addr,0);
server_addr.sin_family =AF_INET;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
server_addr.sin_port =htons(PORT);
if(connect(ssock,(struct sockaddr *)&server_addr,clen)<0){
perror("connect error:");
exit(1);
}
while(1)
{
printf("input msg:");
fgets(writebuf,MAXBUF,stdin);
if(write(ssock,writebuf,MAXBUF)<0)
{
perror("write error:");
}
readbytes=read(ssock,readbuf,MAXBUF);
if( readbytes <0 )
{
perror("read error:");
exit(1);
}
if( readbytes ==0 )
{
printf("connection closed \n");
break;
}
printf("%s\n",readbuf);
}
close(ssock);
return 0;
}
实现Linux select IO复用C/S服务器代码的更多相关文章
- Linux网络编程服务器模型选择之IO复用循环并发服务器
在前面我们介绍了循环服务器,并发服务器模型.简单的循环服务器每次只能处理一个请求,即处理的请求是串行的,效率过低:并发服务器可以通过创建多个进程或者是线程来并发的处理多个请求.但是当客户端增加时,就需 ...
- linux的IO复用,select机制理解--ongoing
一:首先需要搞清楚IO复用.阻塞的概念: Ref: https://blog.csdn.net/u010366748/article/details/50944516 二:select机制 作为IO ...
- 使用select io复用实现超时设置
在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...
- 7.3 5种IO模型与IO复用
5种IO模型分别如下: 1.阻塞IO模型 当上层应用app1调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层app1将阻塞(默认行为,被linux内核阻塞). 当对等方发送了数据 ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- Linux Network IO Model、Socket IO Model - select、poll、epoll
目录 . 引言 . IO机制简介 . 阻塞式IO模型(blocking IO model) . 非阻塞式IO模型(noblocking IO model) . IO复用式IO模型(IO multipl ...
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...
- Linux中的IO复用接口简介(文件监视?)
I/O复用是Linux中的I/O模型之一.所谓I/O复用,指的是进程预先告诉内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程进行处理,从而不会在单个I/O上导致阻塞. 在Linux ...
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】
转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnb ...
随机推荐
- CentOS/Linux安装VNCserver
VNC全称是Virtual Network Computing,属于远程控制类软件.其优点是支持跨操作系统的远程图形化控制.在日常工作中,服务器常常是存在机房,不可能每次需要图形界面操作就跑到机房,因 ...
- 使用Hibernate框架技术时,对项目进行的配置
1.在需要使用Hibernate框架技术的项目上单击鼠标右键,在弹出的菜单中选择MyEclipse-->Add Hibernate Capabilities,打开Add Hibernate Ca ...
- [转]IIS7.5 添加expires头 提高性能
本文转自:http://niutuku.com/tech/www/271454.shtml 对于页面中不经常变化的静态内容通过指定expires头,来进行浏览器端的缓存,减少每次访问时的请求. 原理: ...
- [改善Java代码]使用静态内部类提高封装性
建议38: 使用静态内部类提高封装性 Java中的嵌套类(Nested Class)分为两种:静态内部类(也叫静态嵌套类,Static Nested Class)和内部类(Inner Class).内 ...
- [BigData]关于HDFS的伪分布式安装和虚拟机网络的配置
[BigData]关于Hadoop学习笔记第一天(段海涛老师)(三) 视频2: hadoop的应用在电商,"浏览了该商品的人还看了","浏览了该商品的人最终购买的&quo ...
- Ubuntu下用SecureCRT连接串口/dev/ttyUSB0权限修复
在普通用户的模式下,用SecureCRT链接串口交换机,开始会提示/dev/ttyUSB0权限不足,无法打开,临时的解决办法是 chmod 0+rw /dev/ttyUSB0 但是这个重启后便没了作用 ...
- JavaScript “\”替换成 “\\”
str=str.replace(/\\/g,'\\\\');
- Linux 命令 - chown: 更改文件的所有者和所属群组
chown 命令用来更改文件或者目录的所有者和所属群组.使用这个命令需要超级用户的权限. 命令格式 chown [OPTION]... [OWNER][:[GROUP]] FILE... chown ...
- SVN对unity3d项目版本进行管理的不方便问题,研究ing
unity3d项目版本控制遇到些问题,找了以下资料做参考,现在mark一下,以后慢慢解决,之后总结. Unity开启meta. meta:版本控制文件,在新加入项时,Unity3D会产生一个同名的.m ...
- HDOJ2030汉字统计
汉字统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...