设为首页 加入收藏

TOP

Linux 初识Libevent网络库(二)
2019-07-05 18:10:29 】 浏览:184
Tags:Linux 初识 Libevent 网络
} int main(int argc, char** argv){ int port = atoi(argv[1]); struct event_base* base; base = event_base_new(); if(!base){ perror("event_base_new"); exit(1); } struct sockaddr_in s; s.sin_family = AF_INET; s.sin_port = htons(port); s.sin_addr.s_addr = htonl(INADDR_ANY); struct evconnlistener* listener = evconnlistener_new_bind(base, listencb, NULL, LEV_OPT_CLOSE_ON_FREE, -1, (struct sockaddr*)&s, sizeof(s)); if(!listener){ perror("bind"); exit(1); } event_base_dispatch(base); event_base_free(base); }

client端:

#include <event2/event.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <event2/bufferevent.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <event2/listener.h>
#include <event2/dns.h>
#include <stdlib.h>
#include <event2/util.h>

//read write callback
void readcb(struct bufferevent *bev, void *ctx){
  char buf[64];
  size_t ret = bufferevent_read(bev, buf, sizeof(buf));
  buf[ret] = '\0';
  printf("client recf:%s\n", buf);

}

//event callback
void eventcb(struct bufferevent *bev, short what, void *ctx){
  if(what & BEV_EVENT_CONNECTED){
    printf("connect okay\n");  
  }
  else if(what & BEV_EVENT_ERROR){
    struct event_base* base = ctx;
    int err = bufferevent_socket_get_dns_error(bev);
    if(err){
      printf("DNS error:%s\n", evutil_gai_strerror(err));
    }
    printf("closing\n");
    bufferevent_free(bev);
    event_base_loopexit(base, NULL);
  }
}

//terminal read callback
void termicb(evutil_socket_t fd, short what, void* ptr){
  char buf[64] = {0};
  int len = read(fd, buf, sizeof(buf));
  buf[len] = '\0';
  printf("in termicb\n");
  struct bufferevent* bev = ptr;
  bufferevent_write(bev, buf, len);
}
int main(int artc, char** argv){

  struct event_base* base;
  base = event_base_new();
 
  struct evdns_base* dns_base;
  dns_base = evdns_base_new(base, 1);

  struct bufferevent* bev;
  bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);

  int port = atoi(argv[2]);
  bufferevent_setcb(bev, readcb, NULL, eventcb, base);
  bufferevent_enable(bev, EV_READ);
  bufferevent_socket_connect_hostname(bev, dns_base, AF_INET, argv[1], port);

  struct event* ev = event_new(base, STDIN_FILENO, EV_READ | EV_PERSIST, termicb, bev);
  event_add(ev, NULL);
  event_base_dispatch(base);
  event_base_free(base);
}

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言:正负数之间取模运算(转载.. 下一篇用GDB调试程序(一)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目