socket学习笔记——select与epoll函数的使用(linux)
select.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/socket.h> #define BUF_SIZE 100
void error_handling(char* message); int main(int argc,char* argv[])
{
int serv_sock,clnt_sock;
struct sockaddr_in serv_addr,clnt_addr;
struct timeval timeout;
fd_set reads,cp_reads;
socklen_t adr_sz;
int fd_max,str_len,fd_num,i;
char buf[BUF_SIZE]; if(argc != )
{
printf("usage: %s <port>\n",argv[]);
exit();
} serv_sock = socket(PF_INET,SOCK_STREAM,);
memset(&serv_addr,,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[])); if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -)
error_handling("bind error");
if(listen(serv_sock,) == -)
error_handling("listen error"); FD_ZERO(&reads);
FD_SET(serv_sock,&reads);
fd_max = serv_sock;
while()
{
cp_reads = reads;
timeout.tv_sec = ; if((fd_num = select(fd_max+,&cp_reads,,,&timeout)) == -)
break;
if(fd_num == )
continue; for(i = ;i < fd_max+;i++)
{
if(FD_ISSET(i,&cp_reads))
{
if(i == serv_sock)
{
adr_sz = sizeof(clnt_addr);
clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_addr,&adr_sz);
FD_SET(clnt_sock,&reads);
if(fd_max < clnt_sock)
fd_max = clnt_sock;
printf("connected client:%d \n",clnt_sock);
}
else
{
str_len = read(i,buf,BUF_SIZE);
if(str_len == )
{
FD_CLR(i,&reads);
close(i);
printf("closed client: %d\n",i);
}
else
write(i,buf,str_len);
}
}
}
}
close(serv_sock);
return ;
} void error_handling(char* message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
epoll.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/epoll.h> #define BUF_SIZE 100
#define EPOLL_SIZE 50
void error_handling(char* message);
int main(int argc,char* argv[])
{
struct sockaddr_in serv_addr,clnt_addr;
int serv_sock,clnt_sock;
socklen_t adr_sz;
int str_len,i;
char buf[BUF_SIZE]; struct epoll_event *ep_events;
struct epoll_event event;
int epfd,event_cnt; if(argc != )
{
printf("usage:%s <port>\n",argv[]);
exit();
} serv_sock = socket(PF_INET,SOCK_STREAM,);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[])); if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -)
error_handling("bind error");
if(listen(serv_sock,) == -)
error_handling("listen error"); epfd = epoll_create(EPOLL_SIZE);
ep_events = malloc(sizeof(struct epoll_event)*EPOLL_SIZE); event.events = EPOLLIN;
event.data.fd = serv_sock;
epoll_ctl(epfd,EPOLL_CTL_ADD,serv_sock,&event); while()
{
event_cnt = epoll_wait(epfd,ep_events,EPOLL_SIZE,-);
if(event_cnt == -)
{
puts("epoll_wait error");
break;
}
for(i = ;i < event_cnt;i++)
{
if(ep_events[i].data.fd == serv_sock)
{
adr_sz = sizeof(clnt_addr);
clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_addr,&adr_sz);
event.events = EPOLLIN;
event.data.fd = clnt_sock;
epoll_ctl(epfd,EPOLL_CTL_ADD,clnt_sock,&event);
printf("connected client:%d\n",clnt_sock);
}
else
{
str_len = read(ep_events[i].data.fd,buf,BUF_SIZE);
if(str_len == )
{
epoll_ctl(epfd,EPOLL_CTL_DEL,ep_events[i].data.fd,NULL);
close(ep_events[i].data.fd);
printf("closed client:%d\n",ep_events[i].data.fd);
}
else
write(ep_events[i].data.fd,buf,str_len);
}
}
}
close(serv_sock);
close(epfd);
return ;
} void error_handling(char* message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
socket学习笔记——select与epoll函数的使用(linux)的更多相关文章
- socket学习笔记——select函数的使用(windows)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h ...
- 笔记-select,poll,epoll
笔记-select,poll,epoll 1. I/O多路复用 I/O多路复用是指:通过一种机制或一个进程,可以监视多个文件描述符,一旦描述符就绪(写或读),能够通知程序进行相应的读写操作. ...
- Hadoop源码学习笔记(2) ——进入main函数打印包信息
Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...
- python开发学习-day10(select/poll/epoll回顾、redis、rabbitmq-pika)
s12-20160319-day10 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- socket编程以及select、epoll、poll示例详解
socket编程socket这个词可以表示很多概念,在TCP/IP协议中“IP地址 + TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP + 端口号”就称为socket.在TCP协议中,建立 ...
- socket编程之select(),poll(),epoll()
socket编程,通信 client端 socket() ----->connect() ------->recv() -----> close(); server端 socket ...
- socket 学习笔记
#include <sys/socket.h> ---------------------------------------------------------------------- ...
- JavaScript学习笔记(七)——函数的定义与调用
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 详述socket编程之select()和poll()函数
转自:http://www.cppblog.com/myjfm/archive/2011/10/26/159093.aspx select()函数和poll()函数均是主要用来处理多路I/O复用的情况 ...
随机推荐
- python主要用来做什么
python这门编程语言在国外极受欢迎,但在国内使用还不是极普遍. 由于python编程效率极高,现在国内的使用者也开始变得越来越多. python主要用来做什么?这个语言到底有哪些作用呢? 下面主是 ...
- android学习笔记14——GridView、ImageSwitcher
GridView--网格视图.ImageSwitcher--图像切换器 ==> GridView,用于在界面上按行.列的分布形式显示多个组件:GridView和ListView父类相同——Abs ...
- 【log】log4j
常用log4j.properties配置文件 log4j.rootLogger = info,console #指定serviceImpl层 日志输出 log4j.logger.com.sms.ser ...
- Hibernate与MyBatis区别
Hibernate是当前主流的ORM框架,对数据库结构提供了较为完整的封装. MyBatis同样也是非常流行的ORM框架,主要在于pojo与SQL之间的映射关系. 区别: 1.两者最大的区别 针对简单 ...
- 在Java中使用Memcached(转)
memcache的Java客户端调用,在网上还是有些少,很多都是php的.如何要想用Java调用memcache的服务,首先要有客户端的支持,我们先下载一个客户端吧.下载地址:https://gith ...
- (C#) 多线程修改布尔值, volatile
参考: https://msdn.microsoft.com/en-us/library/x13ttww7(VS.80).aspx http://stackoverflow.com/questions ...
- 转--2014年最新810多套android源码2.46GB免费一次性打包下载
转载自:http://www.eoeandroid.com/thread-497046-1-1.html 感谢该博客主人无私奉献~~ 下面的源码是从今年3月份开始不断整理源码区和其他网站上的安卓例子源 ...
- make[1]: *** [pcrecpp.lo] 错误 1
在安装:pcre-8.30 时,报如下错误: [root@localhost pcre-8.30]# make && make installmake all-ammake[1]: ...
- iOS 图片拉伸 resizableImageWithCapInsets
UIImage *image = [[UIImage imageNamed:@"test.png"] resizableImageWithCapInsets:UIEdgeInse ...
- CEO应向软件工程师学习的7个技能
软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学 ...