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)的更多相关文章

  1. socket学习笔记——select函数的使用(windows)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h ...

  2. 笔记-select,poll,epoll

    笔记-select,poll,epoll 1.      I/O多路复用 I/O多路复用是指:通过一种机制或一个进程,可以监视多个文件描述符,一旦描述符就绪(写或读),能够通知程序进行相应的读写操作. ...

  3. Hadoop源码学习笔记(2) ——进入main函数打印包信息

    Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...

  4. python开发学习-day10(select/poll/epoll回顾、redis、rabbitmq-pika)

    s12-20160319-day10 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  5. socket编程以及select、epoll、poll示例详解

    socket编程socket这个词可以表示很多概念,在TCP/IP协议中“IP地址 + TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP + 端口号”就称为socket.在TCP协议中,建立 ...

  6. socket编程之select(),poll(),epoll()

    socket编程,通信 client端  socket() ----->connect() ------->recv() -----> close(); server端 socket ...

  7. socket 学习笔记

    #include <sys/socket.h> ---------------------------------------------------------------------- ...

  8. JavaScript学习笔记(七)——函数的定义与调用

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  9. 详述socket编程之select()和poll()函数

    转自:http://www.cppblog.com/myjfm/archive/2011/10/26/159093.aspx select()函数和poll()函数均是主要用来处理多路I/O复用的情况 ...

随机推荐

  1. Windows Server 2008 - How to Move the Quorum Disk Group

    I received this question from a friend the other day - asking how on a Windows Server 2008 cluster y ...

  2. 20个超实用的JavaScript技巧及最佳实践

    1.第一次给变量赋值时,别忘记var关键字   给一个未声明的变量赋值,该变量会被自动创建为全局变量,在JS开发中,应该避免使用全局变量.   2.使用===替换==   并且永远不要使用=或!=. ...

  3. 黄聪:jquery mobile通过a标签页面跳转后,样式丢失、js失效的解决方法

    问题描述: 用ajax跳转的时候,从a.html跳转到b.html后,b.html的css以及js都失效了. 解决办法1: 将所有的css以及js全部放在div内. 原理: 由于jqm的ajax跳转的 ...

  4. Javascript金额转化

    //"123,456.78"----> 123456.78(float格式) function rmoney(s) { return parseFloat(s.replace ...

  5. 执行sh文件 进行MongoDB的业务逻辑导入

    将从HDFS中的数据转化为Json格式写入文件后,十个文件的文件名为 文件名_01 ...._02 ....03格式. 编写个简单的sh文件 通过for do循环让i+1 文件名对应上就可以的- -执 ...

  6. ADF_Starting系列5_使用ADF开发富Web应用程序之维护User Interface(Part2)

    2014-05-05 Created By BaoXinjian

  7. PLSQL_批量压缩表Table Compress(案例)

    2015-04-01 Created By BaoXinjian

  8. redis使用日志(二) 数据存储到redis

    一段简短的代码,来展示如何把爬取内容写到redis里面: #! /usr/bin/env python # -*- coding=utf-8 -*- import requests import js ...

  9. Javascript生成GUID

    GUID(全球唯一标识)是微软使用的一个术语,由一个特定的算法,给某一个实体,如Word文档,创建一个唯一的标识,GUID值就是这个唯一的标识码.除了.Net有专门的方法生成外,JS也可以生成GUID ...

  10. requesting java ast from selection

    遇到這個錯誤是因為在eclipse中選擇了maven->update project.接著就不斷的出現題目上的錯誤,然後就提示是否退出workbench. 查看了一下項目的compile jre ...