// libev.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <stdio.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
#include <ev.h>
#define MAXLEN 1023
#define PORT 8003
#define ADDR_IP "127.0.0.1"int socket_init();
void accept_callback(struct ev_loop *loop, ev_io *w, int revents);
void recv_callback(struct ev_loop *loop, ev_io *w, int revents);
void write_callback(struct ev_loop *loop, ev_io *w, int revents);int main(int argc, char** argv)
{int listen;ev_io ev_io_watcher;listen = socket_init();struct ev_loop *loop = ev_loop_new(EVBACKEND_EPOLL);ev_io_init(&ev_io_watcher, accept_callback, listen, EV_READ);ev_io_start(loop, &ev_io_watcher);ev_loop(loop, 0);ev_loop_destroy(loop);return 0;}int socket_init()
{struct sockaddr_in my_addr;int listener;if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");exit(1);}else{printf("SOCKET CREATE SUCCESS!\n");}//setnonblocking(listener);int so_reuseaddr = 1;setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof(so_reuseaddr));bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = PF_INET;my_addr.sin_port = htons(PORT);my_addr.sin_addr.s_addr = inet_addr(ADDR_IP);if (bind(listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1){perror("bind error!\n");exit(1);}else{printf("IP BIND SUCCESS,IP:%s\n", ADDR_IP);}if (listen(listener, 1024) == -1){perror("listen error!\n");exit(1);}else{printf("LISTEN SUCCESS,PORT:%d\n", PORT);}return listener;
}void accept_callback(struct ev_loop *loop, ev_io *w, int revents)
{int newfd;struct sockaddr_in sin;socklen_t addrlen = sizeof(struct sockaddr);ev_io* accept_watcher = malloc(sizeof(ev_io));while ((newfd = accept(w->fd, (struct sockaddr *)&sin, &addrlen)) < 0){if (errno == EAGAIN || errno == EWOULDBLOCK){//these are transient, so don't log anything.continue;}else{printf("accept error.[%s]\n", strerror(errno));break;}}ev_io_init(accept_watcher, recv_callback, newfd, EV_READ);ev_io_start(loop, accept_watcher);printf("accept callback : fd :%d\n", accept_watcher->fd);}void recv_callback(struct ev_loop *loop, ev_io *w, int revents)
{char buffer[1024] = { 0 };int ret = 0;//ev_io write_event;
loop:ret = recv(w->fd, buffer, MAXLEN, 0);if (ret > 0){printf("recv message :%s  \n", buffer);}else if (ret == 0){printf("remote socket closed!socket fd: %d\n", w->fd);close(w->fd);ev_io_stop(loop, w);free(w);return;}else{if (errno == EAGAIN || errno == EWOULDBLOCK){goto loop;}else{printf("ret :%d ,close socket fd : %d\n", ret, w->fd);close(w->fd);ev_io_stop(loop, w);free(w);return;}}int fd = w->fd;ev_io_stop(loop, w);ev_io_init(w, write_callback, fd, EV_WRITE);ev_io_start(loop, w);printf("socket fd : %d, turn read 2 write loop! ", fd);}void write_callback(struct ev_loop *loop, ev_io *w, int revents)
{char buffer[1024] = { 0 };//ev_io read_event;snprintf(buffer, 1023, "this is a libev server!\n");write(w->fd, buffer, strlen(buffer), 0);int fd = w->fd;ev_io_stop(loop, w);ev_io_init(w, recv_callback, fd, EV_READ);ev_io_start(loop, w);
}

网络开源框架之libev使用实例相关推荐

  1. 网络开源框架之libevent使用实例

    #pragma once #include "CLibEventData.h" #include "LibEventFunction.h" #include & ...

  2. [13]深入浅出工作开源框架Camunda:多实例并行用户任务

    Camunda提供了多实例并行用户任务,比如下面的并行多任务流程! 必须选择三条竖杠. 选择之后,就可以让"并行会签预审批"任务同时由多个人处理~ 参考<基于camunda如 ...

  3. Android_开源框架_Volley实例

    2019独角兽企业重金招聘Python工程师标准>>> 1.自定义相关类 在 Android_开源框架_Volley(Google IO 2013)源代码及内部实现过程分析一文中,简 ...

  4. 开源 Python网络爬虫框架 Scrapy

    开源 Python 网络爬虫框架 Scrapy:http://blog.csdn.net/zbyufei/article/details/7554322 介绍 所谓网络爬虫,就是一个在网上到处或定向抓 ...

  5. 有限状态机的C++实现(2)-bayonet开源网络服务器框架

    有限状态机的C++实现(2)-bayonet开源网络服务器框架 | Vimer的程序世界 有限状态机的C++实现(2)-bayonet开源网络服务器框架 Published on 二月 18, 201 ...

  6. 开源的网络服务框架:Apache Etch 1.4.0 发布

    Apache Etch是一个开源.跨平台.语言和传输方式独立的网络服务框架,可用来构建和使用网络服务.Etch提供的工具集包括一个网络服务描述语言.一个编译器和与各种语言进行绑定的库.它具有传输方式独 ...

  7. 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]

    开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一] 1. 简介 1.1 结识Lidgren的机缘巧合 开发Unity的各位或多或少都可能在工作中遇到非客户端开发的一些内容.大型 ...

  8. 国产开源网络编程框架tio的得意之作—谭聊介绍

    想各位对即时通讯源码有追求人,必然有所了解谭聊,谭聊是完全基于开源网络编程框架t-io开发的一款即时通讯软件,也是t-io作者亲自操刀,性能上的强大能力完全继承了t-io的特性,即单机版可以达到近百万 ...

  9. 跨平台微信网络开源Mars与网络框架Okhttp、Volley、Retrofit,Cookie持久化

    > 1. Mars 移动端IM网络层跨平台组件库Mars- https://github.com/Tencent/mars Android.iOS.OS X 平台的 demo(微信开源Mars的 ...

最新文章

  1. 现浇板弹性计算还是塑性计算,板塑性和弹性
  2. navicat 连接oracle
  3. Redis之跳跃表(面试重点容易考)
  4. python创建线程_多种方法实现 python 线程池
  5. 技术人员如何创业《四》- 打造超强执行力团队(转载)
  6. java封装概念_Java面向对象----封装概念
  7. Anaconda中如何查看已经安装的包
  8. 每天备份数据库中的表
  9. leetCode:35. 搜索插入位置
  10. 【水果识别】基于matalb GUI灰度、二值化、滤波水果分级【含Matlab源码 1848期】
  11. (转)Please ensure Intel HAXM is properly installed and usable. 解决方案
  12. 腾讯翻译君在线翻译怎么翻译整个文件_腾讯文档:在线多人协作文档工具
  13. SPSS实现游程检验
  14. 我的JavaScript学习之路四:JavaScript数据类型之Number类型(1)
  15. 我偷看了老板的微信分组,整个人都不好了…
  16. Docx 生成word文档
  17. XPE及CE系统对比
  18. 马云:30年后每对年轻人要养8个老人 管理5套房子
  19. 将输入值为非数字的字符替换为空
  20. javascript实现图片滚动效果

热门文章

  1. C~K的班级(II)_JAVA
  2. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
  3. Netty入门官方例子
  4. Apache commons lang3包ArrayUtils工具使用
  5. 《卓有成效的程序员》读书笔记
  6. 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机科学理论
  7. 程序员面试题精选100题(62)-C/C++/C#面试题(5)
  8. 程序员面试题精选100题(45)-Singleton(C/C++/C#)
  9. 不知道被谁删了微信好友?用 Python 来帮忙呀
  10. 利用github-pages建立个人博客