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复用的情况 ...
随机推荐
- android学习笔记18——dpi、dp、sp、xp......
参考:http://www.cnblogs.com/greatverve/archive/2011/12/28/android-dip-dp-sp-pt-px.html http://www.360 ...
- android下asynchttp库对于session的支持
默认asynchttp库不支持session,需要用户配置下cookie来处理,直接贴支持session的代码 package example.com.sessiontest; import andr ...
- [linux basic 基础]----同步互斥量
互斥量,运行程序元锁住某个对象,使得每次只能有一个线程访问它:为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁它 :基本函数与用于信号量的函数非常相似#inclu ...
- Hadoop学习4--安装Hadoop
首先献上Hadoop下载地址: http://apache.fayea.com/hadoop/core/ 选择相应版本,点一下,直接进行http下载了. 对原来写的一篇文章,相当不满意,过于粗糙了,于 ...
- adb上使用cp/mv命令的替代方法(failed on '***' - Cross-device link解决方法)
今天把玩手头的那部Android手机时碰到一个问题,即因为权限问题无法将文件复制到/system/和/data/分区中,经过一番折腾后,算是解决了,在此记录一笔.本方所涉及到的命令输入,均用斜体字表示 ...
- centos下安装mycat
1.在某个临时文件夹下下载mycat(此处用的是1.4 RELEASE)wget https://raw.githubusercontent.com/MyCATApache/Mycat-downloa ...
- 三、jdk工具之jstack(Java Stack Trace)
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- mongodb的python接口pymongo使用
1. 连接 from pymongo import MongoClient client = MongoClient("mongodb://mongodb0.example.net:2701 ...
- Java 开发 gRPC 服务和客户端
新建一个普通的Maven项目: 配置pom文件,导入gRPC的依赖和插件 pom 中增加外部依赖 <dependency> <groupId>io.grpc</g ...
- Mac 下 Maven 的命令行安装
JDK 的安装 系统的“系统偏好设置”中我们可以看到 Java的设置, Java 7(含) 之后的版本在这里可以看到. 点击进去后,可以看到独立的 Java 控制面板 注意,这里是 JRE 的版本, ...