libevent学习笔记二:使用evdns_getaddrinfo()的例子
来源:互联网 发布:施工动画什么软件 编辑:程序博客网 时间:2024/06/10 12:20
#include<event2/dns.h>#include<event2/util.h>#include<event2/event.h>#include<sys/socket.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>int n_pending_requests=0;struct event_base* base=NULL;struct user_data{char* name;int idx;};void callback(int errcode,struct evutil_addrinfo* addr,void *ptr){struct user_data* data=(struct user_data* )ptr;const char *name=data->name;if(errcode){printf("%d.%s->%s\n",data->idx,name,evutil_gai_strerror(errcode));}else{struct evutil_addrinfo *ai;printf("%d.%s",data->idx,name);if(addr->ai_canonname){printf("[%s]",addr->ai_canonname);}puts("");for(ai=(evutil_addrinfo*)addr;ai;ai=(evutil_addrinfo*)ai->ai_canonname){char buf[128];const char * s=NULL;if(ai->ai_family==AF_INET){struct sockaddr_in* sin=(struct sockaddr_in*)ai->ai_addr;s=evutil_inet_ntop(AF_INET,&sin->sin_addr,buf,128);}else if(ai->ai_family==AF_INET6){struct sockaddr_in6 *sin6=(struct sockaddr_in6*)ai->ai_addr;s=evutil_inet_ntop(AF_INET6,&sin6->sin6_addr,buf,128);}if(s){printf(" ->%s\n",s);}}evutil_freeaddrinfo(addr);}free(data->name);free(data);if(--n_pending_requests==0){event_base_loopexit(base,NULL);}}int main(int argc,char* argv[]){int i;struct evdns_base* dnsbase;if(argc==1){puts("No addresses given.");return 0;}base=event_base_new();if(!base){return 1;}dnsbase=evdns_base_new(base,1);if(!dnsbase){return 2;}for(i=1;i<argc;++i){struct evutil_addrinfo hints;struct evdns_getaddrinfo_request* req;struct user_data* user_data;memset(&hints,0,sizeof(hints));hints.ai_family=AF_UNSPEC;hints.ai_flags=EVUTIL_AI_CANONNAME;hints.ai_socktype=SOCK_STREAM;hints.ai_protocol=IPPROTO_TCP;if(!(user_data=(struct user_data*)malloc(sizeof(user_data)))){perror("malloc");exit(1);}if(!(user_data->name=strdup(argv[i]))){perror("strdup");exit(1);}user_data->idx=i;++n_pending_requests;req=evdns_getaddrinfo(dnsbase,argv[i],NULL,&hints,callback,user_data);if(req==NULL){printf(" [request for %s returned immediately]\n",argv[i]);}}if(n_pending_requests){event_base_dispatch(base);}evdns_base_free(dnsbase,0);event_base_free(base);return 0;}
0 0
- libevent学习笔记二:使用evdns_getaddrinfo()的例子
- libevent 学习笔记 二
- 稳定的libevent使用例子
- 【Networking】libevent的学习笔记
- Libevent学习笔记(一):基本使用
- Libevent源码学习(二) 事件的概念
- Libevent的一个例子
- libevent学习二
- Yii学习笔记之二(使用gii生成一个简单的例子)
- libevent在异步socket中使用的例子
- libevent学习笔记
- Libevent库学习笔记
- 学习笔记--libevent min_heap
- libevent学习笔记
- libevent学习笔记 -evbuffer
- Libevent学习笔记
- libevent 学习笔记 一
- libevent 学习笔记 三
- ARM交叉编译工具链制作
- CYC-数据库的运用
- 【Android应用开发技术:网络通信】Socket套接字
- HDU 5491 The next(2015 ACM/ICPC Asia Regional Hefei Online )(贪心)
- spark streaming updateStateByKey 用法
- libevent学习笔记二:使用evdns_getaddrinfo()的例子
- Spring学习笔记-在Filter中获取SpingIOC容器
- Improved Noise reference implementation
- Struts2六、为应用指定多个配置文件
- C++ primer 5 笔记4 chapter 4 表达式
- JS中语句使用的注意事项
- LockBox - RSA
- Swift 2.0中的数据类型
- Exporting C++ classes from a DLL