IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

关于libcurl不发包的bug定位

Vimer 2012-01-16 00:05:05 累计浏览 4,084 次
本机暂存

    前几天同事的程序有个很奇怪的bug,跟大家分享一下。

     描述如下:一个http接口在测试环境下能够正常访问,在外网环境下就会直接超时,并且超时的消耗是建是0ms。

     我strace了一下,libcurl在测试环境能正常发包,在外网环境却总是直接返回,连连接都没有尝试建立。

    仔细研究了他的代码,发现并没有什么不合理之处,一筹莫展时发现有如下代码:

1
2
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, (int)(timeout_sec*1000));                                                        
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, (int)(timeout_sec*1000));

    突然想起之前有文章说curl只支持秒级的超时时间,而我们外网的超时配置的是0.5秒。

     把超时时间改成1秒之后,果然一切正常了。

    google上搜了一下,在如下链接找到了答案:

     http://stackoverflow.com/questions/1856473/why-would-curl-ignore-curlopt-timeout-ms-but-honor-curlopt-timeout

The version of curl I am using (7.15.5) doesn\'t support CURLOPT_TIMEOUT_MS. According to Greg I need at least 7.16.2.

    看了一下外网curl的版本:

user_00@RS_Server_appsupport:~> curl --version
curl 7.15.1 (x86_64-suse-linux) libcurl/7.15.1 OpenSSL/0.9.8a zlib/1.2.3 libidn/0.6.0
Protocols: tftp ftp gopher telnet dict ldap http file https ftps 
Features: IDN IPv6 Largefile NTLM SSL libz

    果然是低于7.16.2。

    问题到这里算是解决了,但是还有一个很奇怪的地方,就是我们测试环境的curl版本也是7.15.1,但是配置0.5秒用起来却没有任何问题。当然唯一不同的是,外网是64位,测试环境是是32位而已。

$ curl --version
curl 7.15.1 (i686-suse-linux) libcurl/7.15.1 OpenSSL/0.9.8a zlib/1.2.3 libidn/0.6.0
Protocols: tftp ftp gopher telnet dict ldap http file https ftps 
Features: IDN IPv6 Largefile NTLM SSL libz

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Fix Bug的五个阶段 (累计阅读 42,974)
  2. 浅析http协议、cookies和session机制、浏览器缓存 (累计阅读 17,446)
  3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  4. libcurl的使用总结(二) (累计阅读 15,083)
  5. 调试工具之GDB (累计阅读 14,832)
  6. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,302)
  7. HTTP协议Keep-Alive模式详解 (累计阅读 12,105)
  8. gdb的基本工作原理是什么? (累计阅读 11,684)
  9. 你必须了解的Session的本质 (累计阅读 11,442)
  10. curl 命令使用cookie (累计阅读 10,018)