实现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 ...
随机推荐
- JAVA实现DES加密
DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少 ...
- 【报错】"The constructor Notification(int, CharSequence, long) is deprecated
Notification的构造方法 Notification(int, CharSequence, long) 在API11之后就淘汰了,之后的API需要用Notification.Builder() ...
- MySQL多实例配置
实验环境:RHEL6.4为最小化安装,mysql安装包为通用二进制安装包,版本为mysql-5.6.26 创建mysql用户 #useradd –M –s /sbin/nologin mysql #y ...
- Adobe Edge Animate –EdgeCommons Log和全局变量设置功能
Adobe Edge Animate –EdgeCommons Log和全局变量设置功能 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 一.Log功能 当 ...
- [改善Java代码]不使用stop方法停止线程
线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. ...
- nineOldAnimation 应用
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Spring(3.2.3) - Beans(9): @Resoure & @Autowired
@Resource 和 @Autowired 都是用来装配依赖的,它们之间有些异同. @Resoure @Resource 是 JSR-250 规范的注解. @Resource 可以标注在字段.方法上 ...
- JAVA.IO流学习笔记
一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...
- php 中cookie和session的用法比较
1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session. ...
- asp.net中C#获取字符串中汉字的个数实例
符串可以包括数字,字母,汉字或者其他的字符.使用Char类型的IsDigit静态方法可以判断字符串中的字符是否为数字,使用Char类型中的 IsLetter静态方法可以判断字符串中是否为字母.我们来实 ...