现在的位置: 首页 > 综合 > 正文

从libevent1.4到libevent2.0碰到的问题,struct evhttp_uri在头文件只有声明

2014年01月20日 ⁄ 综合 ⁄ 共 1160字 ⁄ 字号 评论关闭

最近做ministored的时候用libevent来搭建基于http的框架,手头的库是去年从官网上下来的1.4
stable的版本,开发完服务器端程序以后,发现libevent
1.4对于客户端程序的支持不尽如人意,于是手动写了一个tcp的客户端来发送http的协议。一切ok!

 

后来无意
中跑去官网上看了看,发现libevent 2.0有stable了,忍不住下了一个下来看看,make
install之后开始了我的一天的悲剧之旅。安装完以后,发现Libevent的订阅邮件里面有人写了一个小的倒子,拿下来一试,居然发现编译通不过。
在gcc的提示下,很快的清除了各种问题,只剩下一个问题,提示我找不见struct evhttp_uri 中各成员的具体存储空间。一下子傻眼了,这个
struct evhttp_uri可是一个关键的结构体啊。我了个去,跑到libevent2的头文件里面,先看http.h,里面没有,只有一行声明,
struct
evhttp_uri,然后里面的各式方法里面包含了n多基于这个结构体的方法,而定义却是在http.c里面,找到了struct
evhttp_uri的具体定义。那没错啊,提供的函数可用,那我自然能用。以为是代码混在一起了,于是单独写一个小的程序。

 

#include <errno.h>
#include <stdlib.h>
#include <string.h>
 
#include <event2/event.h>
#include <event2/http.h>
#include <event2/buffer.h>
#include <event2/http_struct.h>
 
 
int main(int argc,char * argv[]){
 
    char url[]="http://192.168.1.200:1314/?opt=get
";
    struct evhttp_uri  *uri = evhttp_uri_parse(url);
    printf("%s/t%s/t%s/n",uri->host,uri->port,uri->query);
}

 

发现在gcc上还是通不过,整到这,一下子郁闷了。为啥示例程序这么写,我写的却过不了;头文件上也有相关的使用啊;难不成是c语言有什么特性我还不了解?

 

想了一晚上,无解,发到水木的c论坛上,一位网友的回复一语惊醒梦中人。他之所以这么写就是不想让你直接引用他的成员,这里面具体内容的更改不影响到程序,里面应该有相应的函数来读写。于是重新跑去看http.h的头文件,tnnd,当时看了那么久,为啥偏偏对evhttp_uri_get***/evhttp_uri_set***这些函数视而不见了。

 

唉,问题解决了,下次碰到同样的问题,一定不要太浮躁,要仔细揣摩下作者背后的意思!

抱歉!评论已关闭.