用libevent实现简易的telnet
生活随笔
收集整理的這篇文章主要介紹了
用libevent实现简易的telnet
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我承認(rèn)這篇文章有點標(biāo)題黨,呵呵。其實就是一個能和服務(wù)器建立全雙工通信的客戶端而已,用網(wǎng)絡(luò)庫libevent實現(xiàn)。 從這里也可以看出,同樣的功能,分別用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>//發(fā)生了致命錯誤,輸入錯誤信息,退出程序
void error_quit(const char *str)
{perror(str);exit(1);
}//連接狀態(tài)改變時回調(diào)的函數(shù)
void eventcb(struct bufferevent *bev, short events, void *ptr)
{struct event_base *tbase = (struct event_base*)ptr;//如果不是連接成功的消息,就停止事件循環(huán)if ( !(events & BEV_EVENT_CONNECTED) ) {bufferevent_free(bev);event_base_loopbreak(tbase);printf("The connect have been shutdown: %X\n", events);}
}//服務(wù)器傳信息過來了
void sockreadcb(struct bufferevent *bev, void *ptr)
{struct evbuffer *input = bufferevent_get_input(bev);evbuffer_write(input, STDOUT_FILENO);
}//標(biāo)準(zhǔn)輸入傳消息過來了
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();//連接服務(wù)器并監(jiān)聽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);//監(jiān)聽標(biāo)準(zhǔn)輸入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);//開始事件循環(huán)event_base_dispatch(base);return 0;
} 編譯與運行命令:
gcc mytelnet.c -o mytelnet -levent
./mytelnet 127.0.0.1 8877 用于測試的服務(wù)器:http://blog.csdn.net/aaa20090987/article/details/8769585
轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/archive/2013/06/07/3125039.html
總結(jié)
以上是生活随笔為你收集整理的用libevent实现简易的telnet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#通过获取快捷方式指向目标的小示例触碰
- 下一篇: AJAX ASP/PHP 请求实例