libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题

libevent 版本导致库不一致导致的问题

大致环境:

     根据目前的需求,需要完成一个双向双网段间的透明代理。程序需要跨平台,因此采用了libevent库进行开发。

但是在windows环境下,直接是在官网下载的最新版libevent-2.0.21-stable.tar.gz,编程使用的VS2008 IDE工具,因此在windows下开发调试通过。

后面在FreeBSD 8.1下使用makefile进行编译,使用到的库还停留在 libevent-1.4.so.4,这时候全然没有发现这个问题,因为Makefile中直接就是一个 -levent。

libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题_第1张图片


流程大致如下:

    前端程序,启动后,监听指定的N个端口,同时创建一个线程去连接 “后端程序”(这里的后端程序,前端程序,可以理解为透明代理,也就是我自己要实现的程序),当连接成功后,event_add(pinfo->ev,sock,EV_READ,recv_from_back,pinfo);  添加这么一个事件,用于接收后端的消息。对于指定监听的N个端口事件,均被添加到 libevent队列,当有连接过来后,将消息封装转发给后端程序。


    后端程序,启动后,监听一个指定的端口,该端口仅用于 ”前端程序“ 连接,当连接成功后,event_add(pinfo->ev,sock,EV_READ,recv_from_front,pinfo);  添加一个事件,用于接收前端的消息。


看似没问题,事实上在Windows下的 libevent2.0库下确实没有问题,但在不匹配的库版本上,问题来了,而且这问题并不是完全不通,丫的,也就是这,让我犯了好久的迷糊,苦苦的查找BUG,根本就没有BUG可查。

现象就是:

一、前端能够顺利连接上后端

前端部署在 192.168.4.242 ,还有一块网卡地址为 172.26.78.1

libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题_第2张图片


二、前端能够接收客户端的连接

三、后端能够收到前端连接,且能收到前端消息

libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题_第3张图片


问题就在,前端却是收不到后端的消息。。。

”[664] 发送给前置机,连接真实服务器[192.168.3.99:80]失败..." 这条消息前置机并没有收到。。。


一开始排除问题,是先检查代码逻辑,确定没有问题了,然后抓包分析,看看是否是因为后端没有发送数据给前端,或者是发送过程中没有收到。。。

libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题_第4张图片

排除这个原因后,实在是想不出问题出在哪儿,这时候,出去外面走走,散散心。。。。    灵光一闪,可能是版本问题,查看版本,发现版本才 1.4,赶紧重新编译libevent到2.0,再次测试。

libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题_第5张图片


正确的运行结果如下:

libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题_第6张图片



总结:

    虽然是一个简单的库版本不匹配引起的问题,但从中却能审视自己,大意忽略了一些基础内容,同时也从中能学到和巩固一些知识,既加深了对libevent的认知,也在检查代码的同时,修正了一些可能存在的隐患。 遇到问题,排除法可能是一个很好的策略。




你可能感兴趣的:(libevent 在FreeBSD下,因为版本的差异,导致了神奇的问题)