Linux 网络编程(epoll)
- 服务器端代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include <errno.h>
#include <sys/epoll.h> int main(int argc, char** argv){ int old_fd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr; char recvbuf[];
int port = ;
int len,nbytes,epfd,i;
//声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
struct epoll_event ev,events[]; //生成用于处理accept的epoll专用的文件描述符,参数为最大的监听数目
epfd = epoll_create(); if((old_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == ){
fprintf(stderr, "socket Error:%s\n\a", strerror(errno));
exit();
} bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if((bind(old_fd, &server_addr, sizeof(server_addr))) == -){
fprintf(stderr, "bind Error:%s\n\a", strerror(errno));
exit();
} if(listen(old_fd, ) == -){
fprintf(stderr, "listen Error:%s\n\a", strerror(errno));
exit();
} ev.data.fd = old_fd;
//设置要处理的事件类型
ev.events = EPOLLIN;
//EPOLL_CTL_ADD 注册新的fd
//EPOLL_CTL_MOD 修改已注册的fd
//EPOLL_CTL_DEL 删除epfd中的一个fd
epoll_ctl(epfd, EPOLL_CTL_ADD, old_fd, &ev); while(){
//int epoll_wait(int epfd, struct epoll_event * events, intmaxevents, int timeout);
//maxevents:每次能处理的事件数;
//timeout:等待I/O事件发生的超时值;-1相当于阻塞,0相当于非阻塞。一般用-1即可
len = epoll_wait(epfd,events,,); for(i = ; i < len; i++){
if(events[i].data.fd == old_fd){
if ((new_fd = accept(old_fd,
(struct sockaddr *)&client_addr,
&len)) == -) {
fprintf(stderr, "Accept error:%s\n\a", strerror(errno));
exit();
} ev.data.fd=new_fd; /*EPOLLIN: 表示对应的文件描述符上有可读数据
EPOLLOUT: 表示可以写数据;
EPOLLPRI: 表示对应的文件描述符有紧急的数据可读
EPOLLERR: 表示对应的文件描述符发生错误;
EPOLLHUP: 表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发ET模式
ET模式:Edge Triggered epoll_wait 只有在读写状态改变时才返回
LT模式:LevelTriggered (默认) epoll_wait 会一致有
EPOLLONESHOT: 只监听一次事件 */
ev.events=EPOLLIN;//对接入的新套接字注册epoll时间监听
epoll_ctl(epfd, EPOLL_CTL_ADD, new_fd, &ev);
}else if(events[i].events&EPOLLIN){
if (events[i].data.fd < )
continue; nbytes = recv(events[i].data.fd, recvbuf, sizeof(recvbuf), );
recvbuf[nbytes] = '\0'; printf("recv data is:%s\n",recvbuf);
}
}
} exit();
}
Linux 网络编程(epoll)的更多相关文章
- Linux 网络编程->epoll<-LT/ET模式整理(~相逢何必曾相识~)
今天自己整理一下epoll,网上有很多经典的介绍,看了很多~收藏了很多~还是整理一下做个积累, 自己的东西好找~ 1. epoll 模型简介 epoll 是Linux I/O 多路复用接口 selec ...
- Linux网络编程1——小端模式与大端模式
数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式).内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式.内存的高地址 ...
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- Linux 网络编程的5种IO模型:异步IO模型
Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
- UNIX网络编程——epoll 的accept , read, write(重要)
在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK). 从字面上看,意思是: EAGAIN: 再试一次 E ...
- linux下编程epoll实现将GPS定位信息上报到服务器
操作系统:CentOS 开发板:fl2440 开发模块:A7(GPS/GPRS),RT3070(无线网卡) ********************************************** ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
随机推荐
- geoServer 发布geoTiff格式的DEM数据
1/数据下载(首先感谢earthexplorer提供了免费的全球DEM数据) 下载地址 https://lta.cr.usgs.gov/GTOPO30 ,首先要注册才可以下载,登陆网站后点击get ...
- NSBundle控件和UIImageView和UIButton区别
1.NSBundle 1> 一个NSBundle代表一个文件夹,利用NSBundle能访问对应的文件夹 2> 利用mainBundle就可以访问软件资源包中的任何资源 3> 模拟器应 ...
- 说说C#的async和await 解决卡顿问题 转
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已. public cla ...
- 下拉框数据的动态选择,类似级联ajax刷新数据
简单的两个下拉列表,第二个中的数据与第一个下拉框相关: --------------------var selected = $(this).children('option:selected').v ...
- JavaBean知识
四.JavaBean的概念1.JavaBean一般具有的特点:a.字段都是私有的. private String name;b.提供公共的getter或setter方法(属性).getter或sett ...
- 结合阿里云服务器,设置家中jetson tk1随时远程登陆
前提条件: 1.路由配置dmz主机为tk1的ip ,设置路由器中ssh 端口22的访问权限 2.有一台远程服务器,服务器安装了php可以运行php文件(我使用的是阿里云) 家中tk1配置: 脚本pyt ...
- C#获取当前路径的7种方法
总结C#获取当前路径的7种方法 C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName ...
- 【转】25个必须记住的SSH命令
1.复制SSH密钥到目标主机,开启无密码SSH登录 ssh-copy-id user@host 如果还没有密钥,请使用ssh-keygen命令生成. 2.从某主机的80端口开启到本地主机2001端口的 ...
- js 正则表达式
//判断字符串是否为数字 function checkRate(input) { var re = /^[0-9]+.?[0-9]*$/; if (!re.test(input.rate.value) ...
- java JFrame窗体真正关闭
程序: package JFrame.bao; import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent; impor ...