linux并发服务器实例,linux-----网络编程----epoll实现并发服务器
/*************************************************************************
> File Name: epoll_serve.c
> Author: xuhcen_allen
> Mail: xuchen_allen@163.com
> Created Time: 2019年02月14日 星期四 09时08分16秒
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 8080
int main()
{
struct sockaddr_in serv_addr,cli_addr;
socklen_t serv_len = sizeof(serv_addr);
socklen_t cli_len = sizeof(cli_addr);
//创建监听套接字:
int lfd = socket(AF_INET,SOCK_STREAM,0);
memset(&serv_addr,0,serv_len);
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port=htons(PORT);
//绑定IP和端口:
bind(lfd,(struct sockaddr*)&serv_addr,serv_len);
//设置同时监听最大个数:
listen(lfd,36);
printf("Waiting for connecting...\n");
//创建epoll根结点:
int epfd = epoll_create(1000);//epoll_creat中的参数现在意义不大;
//初始化epoll树:
struct epoll_event ev;//创建一个事件:
ev.events = EPOLLIN;
ev.data.fd = lfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);//将事件挂在树上,相当于初始化epoll树;
struct epoll_event all[2000];//用数组储存这些事件,方便挂树,查询;
while(1){
//使用epoll通知内核fd 文件IO检测;
int ret = epoll_wait(epfd,all,sizeof(all)/sizeof(all[0]),-1);//将检测到的epfd放到事件数组all中;
//返回值是数组中准备就绪的事件数;
//遍历all数组中的前ret个元素:
for(int i = 0;i
int fd = all[i].data.fd;
//提取出数组元素的fd,判断是否有连接:
if(fd == lfd){//这个if判断是判断用于监听的lfd是否加入到了ret中,如果加入了,就说明有新的连接;
int cfd = accept(lfd,(struct sockaddr*)&cli_addr,&cli_len);
if(cfd<0){
perror("accept error");
exit(1);
}
//将新得到的cfd挂到树上:
struct epoll_event temp;
temp.events = EPOLLIN;
temp.data.fd = cfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&temp);
//打印客户端信息:
char ip[64];
printf("New Client IP:%s ,\t Port:%d\n",inet_ntop(AF_INET,&cli_addr.sin_addr.s_addr,ip,sizeof(ip)) ,ntohs(cli_addr.sin_port));
}
else{
//处理已经连接的客户端发送过来的数据:
if(!all[i].events & EPOLLIN){
continue ;
}
//读数据:
char buf[1024];
int len = recv(fd,buf,sizeof(buf),0);
if(len<0){
perror("recv fail");
exit(1);
}
else if(len==0){
printf(" client disconnecting...\n ");
close(fd);
//fd从epoll树中取下来:
epoll_ctl(epfd,EPOLL_CTL_DEL,fd,NULL);
}
else{
printf( "recv success:\n");
write(STDOUT_FILENO,buf,len);
}
}
}
}
close(lfd);
return 0;
}
linux并发服务器实例,linux-----网络编程----epoll实现并发服务器相关推荐
- Linux多线程、多进程、网络编程常见问题
Linux多进程.多线程.网络编程常见问题 入门 1.GCC的工作流程? 工作流程: 预处理.编译.汇编.链接 具体流程如下: 2.gcc常用的参数选项 3.Makefile介绍 3.1.Makefi ...
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
- C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程
C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍 C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...
- Qt网络编程实战之HTTP服务器-安晓辉-专题视频课程
Qt网络编程实战之HTTP服务器-30196人已学习 课程介绍 设计了一个实用的HTTP服务器,基于Qt的网络框架实现.先详细介绍Qt的网络.IO.线程..自定义事件.配置文件等类库的 ...
- linux服务器开发三(网络编程)
转载自:http://www.cnblogs.com/zfc2201/archive/2017/05/04/6804990.html 作者:水之原 网络基础 协议的概念 什么是协议 从应用的角度出发, ...
- linux服务器开发 3 网络编程
文章目录 Socket编程 1.套接字 2.网络字节序 3.sockaddr数据结构 4.网络套接字函数 5.半关闭 6.2MSL 6.1 TIME_WAIT状态的存在有两个理由: 6.2 该状态为什 ...
- Linux学习——网络编程基础及TCP服务器
目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...
- Linux操作系统下C语言网络编程(全文23475字,包含了Linux系统下所有网络编程的知识点,附程序代码)
一.简介 如今网络应用随处可见,web.http.email 等这些都是网络应用程序,他们都有着基于相同的基本编程模型,有着相似的整体逻辑结构,并且还有着相同的编程接口.我们需要了解基本的客户端-服务 ...
- 【计算机网络】Linux环境中的TCP网络编程
文章目录 前言 一.TCP Socket API 1. socket 2. bind 3. listen 4. accept 5. connect 二.封装TCPSocket 三.服务端的实现 1. ...
最新文章
- 数据中心建设“优劣”在于这几个关键问题
- ibatis学习笔记(三)java实体跟表映射.xml文件详解
- java中抽象类 接口_java中的抽象类与接口
- Linux系统如何在开机时修改root密码
- 如何用大数据找到男/女朋友?
- SQLServer奇偶数的输出
- 教你七招提高.NET网站性能
- Objective C运行时(runtime)技术总结,好强大的runtime
- Discuz!NT 缓存设计简析
- java实现蛇形输出,Java 输入一个正整数,按蛇形打印。
- 【2017级面向对象程序设计寒假作业】第4次作业情况
- CSS中怎么让DIV水平居中
- 在Linux服务器上下载百度云盘中的资料
- 重庆兴渝计算机培训中心,重庆兴渝职业中等专业学校招生录取分数线
- SAP各模块表清单及逻辑关系介绍
- 图形学中常用计算几何总结
- java毕业设计_员工绩效考评系统
- 苹果账号授权登录APP 服务端验证
- 使用urllib发起请求- urlopen发起请求read/decode/getcode/info/geturl-post请求抽屉网
- 红帽linux5.4安装教程,红帽企业Linux5.4下ORACLE安装步骤(推荐).pdf
热门文章
- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
- leetcode 684. Redundant Connection | 684. 冗余连接(并查集)
- JVM从入门到精通(一):JVM入门级class文件格式
- C++ 静态线性表的顺序存储结构(数组实现)
- Hibernate中使用未映射为主键的“id”字段进行查询的场景分析
- MySQL数据库优化技巧(二)
- jQuery——给元素添加父级的方法
- 列出连通集 (25 分)【DFS与BFS模板】
- vue方法传值到data_Vue 组件传值几种常用方法【总结】
- java aio为什么不稳定_烯醇式结构为什么不稳定?