我承认这篇文章有点标题党,呵呵。其实就是一个能和服务器建立全双工通信的客户端而已,用网络库libevent实现。
从这里也可以看出,同样的功能,分别用epoll和libevent来比较,从代码量和代码清晰度来说,libevent完胜,呵呵。
上代码:
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>#include <event.h>
#include <event2/event.h>//发生了致命错误,输入错误信息,退出程序
void error_quit(const char *str)
{perror(str);exit(1);
}//连接状态改变时回调的函数
void eventcb(struct bufferevent *bev, short events, void *ptr)
{struct event_base *tbase = (struct event_base*)ptr;//如果不是连接成功的消息,就停止事件循环if ( !(events & BEV_EVENT_CONNECTED) ) {bufferevent_free(bev);event_base_loopbreak(tbase);printf("The connect have been shutdown: %X\n", events);}
}//服务器传信息过来了
void sockreadcb(struct bufferevent *bev, void *ptr)
{struct evbuffer *input = bufferevent_get_input(bev);evbuffer_write(input, STDOUT_FILENO);
}//标准输入传消息过来了
void stdreadcb(struct bufferevent *bev, void *ptr)
{struct bufferevent *sockbev = (struct bufferevent*)ptr; struct evbuffer *input = bufferevent_get_input(bev);bufferevent_write_buffer(sockbev, input);
}int main(int argc, char **argv)
{struct sockaddr_in servaddr;struct event *shellev;int res;struct event_base *base;struct bufferevent *sockbev;struct bufferevent *stdbev;if( argc != 3 )error_quit("Using: mytelnet <Address> <Port>");memset(&servaddr, 0, sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_port = htons( atoi(argv[2]) );    res = inet_pton(AF_INET, argv[1], &servaddr.sin_addr);  if( res != 1 )error_quit("inet_pton error");   base = event_base_new();//连接服务器并监听sockbev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);res = bufferevent_socket_connect(sockbev,(struct sockaddr *)&servaddr, sizeof(servaddr));if ( res < 0 ) error_quit("connect error");bufferevent_setcb(sockbev, sockreadcb, NULL, eventcb, (void*)base);bufferevent_enable(sockbev, EV_READ);bufferevent_enable(sockbev, EV_WRITE);//监听标准输入stdbev = bufferevent_socket_new(base, STDIN_FILENO, BEV_OPT_CLOSE_ON_FREE);bufferevent_setcb(stdbev, stdreadcb, NULL, NULL, (void*)sockbev);bufferevent_enable(stdbev, EV_READ);bufferevent_enable(stdbev, EV_WRITE);//开始事件循环event_base_dispatch(base);return 0;
}
编译与运行命令:
gcc mytelnet.c -o mytelnet -levent
./mytelnet 127.0.0.1 8877
用于测试的服务器:http://blog.csdn.net/aaa20090987/article/details/8769585

转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/07/3125039.html

用libevent实现简易的telnet相关推荐

  1. 我的偶像——黄鑫的成长

    我相信榜样的力量是无穷的.我相信,探究大牛们的成长,可以让我少走弯路.我相信还有很多  志同道合 的朋友.我 相信,我所关注的这些,从某些方面来说,能反映出我是怎样的一个人,我相信兴趣的力量可以给我的 ...

  2. 【libevent_libev】libevent_libev

    服务端事件组成 1 网络io事件 linux:epoll.poll.select mac:kqueue window:iocp libevent/libev 对 epoll/poll/select/k ...

  3. eNSP 简易telnet配置

    拓扑图: 1.启动路由器 给AR1.AR2改名并且配上IP <Huawei>sys [Huawei]sysname a1 [a1]int g0/0/0 [a1-GigabitEtherne ...

  4. Libevent调用

    1.最基本的打印libevent版本 #include <event.h> #include <stdio.h>int main() {const char *version ...

  5. Cisco路由器的安全配置简易方案

    Cisco路由器的安全配置简易方案 Author: BluShin Auditor: Amy E-mail:Yangtonguang@163.com Version 1.0 Date: 2002-12 ...

  6. RHEL5系统 sendmail+qpopper 架设简易邮件服务器

    转自 "小蜗牛技术之家" 博客  原稿: http://snailwarrior.blog.51cto.com/680306/139098 [小蜗牛奋力之作 ] 目标:在RHEL5 ...

  7. linux下安装配置使用memcache,memcached,libevent(后有ubuntu的memcache安装)

    1: 还是下载 Memcache是用C编写的,要用到C的libevent来处理接口 点击下载memcached-1.4.0.tar.gz 下载libevent-2.0.13-stable.tar.gz ...

  8. 使用 libevent 和 libev 提高网络应用性能

    简介 许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接.无论是通过构建基于云的服务来处理网络通信流,还是把应用程序分布在 IBM Amazon EC 实例上,还是为 ...

  9. php i o优化,PHP之高性能I/O框架:Libevent(一)

    Libevent 是一个用C语言编写的.轻量级的开源高性能I/O框架,支持多种 I/O 多路复用技术: epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O, ...

最新文章

  1. Leetcode:The Skyline Problem
  2. c++ string 与 char 互转 以及base64
  3. 用代理技术实现简单的AOP框架
  4. c++中内敛函数_C/C++求职者必备 23 道面试题,一道试题一份信心
  5. 数据挖掘—朴素贝叶斯分类算法(Java实现)
  6. python xlrd模块_python之xlrd模块
  7. 计算机休眠能降低硬件损耗,Win7居然会出现“失眠”——Win7无法休眠问题解析...
  8. 数据可视化大屏设计经验分享 【进阶篇】
  9. 使用C#语言,从Excel2007中读取数据,并显示到Form中的DataGridView。
  10. Origin画甘特图-II
  11. OpenWrt无线AP+STA配置
  12. wps文字表格制作拼音田字格模板_WPS文字怎么制作田字格 WPS文字制作田字格的方法...
  13. 白鲸优化算法(Beluga whale optimization,BWO)Python实现
  14. GPIB编程控件指令
  15. Java云同桌学习系列(十九)——Linux系统
  16. SQL server 登录名与用户名
  17. Rockchip基于RK3566/RK3568 WiFi AP6256调试笔记
  18. linux系统下qt中文输入法,Ubuntu系统下Qt使用中文输入法(示例代码)
  19. ESP32S3系列--SPI主机驱动详解(一)
  20. 学会自我管理有哪些好处?自我管理包括哪些内容?

热门文章

  1. 随笔(一)-- Jupyter Notebook如何切换主题、更改字体大小
  2. 谷歌新作gVisor:VM容器融合技术已经到来
  3. 新星科技有限公司java_「新星科技」
  4. Qt TCP 通讯简单案例
  5. 简述css布局技术的特点,div+css布局技术漫谈
  6. php 非阻塞mysql_php多进程中的阻塞与非阻塞操作实例分析
  7. c++ map用法_Python专题——五分钟带你了解map、reduce和filter
  8. matlab中的矩阵
  9. 如何发表顶级期刊论文
  10. poj2449(第k短路)