libcurl访问unix socket

最近使用Libcurl访问unix socket,在代码里像这样设置opt:

通过CURLOPT_UNIX_SOCKET_PATH来设置unix socket的路径,域名用localhost占位即可,实际上libcurl会忽略它。

一开始上线发现调用都失败,很快就怀疑到libcurl版本太低,发现CURLOPT_UNIX_SOCKET_PATH在低版本中并不支持(官方文档):

在这种情况下,相当于curl_easy_setopt并没有实现对CURLOPT_UNIX_SOCKET_PATH选项的支持,所以这个调用相当于无效,最终会请求到localhost,也就是127.0.0.1的TCP地址。

我们可以通过yum来升级或者下载libcurl最新源码编译升级。

像libcurl这种著名的开源项目,其导出的API接口都是非常稳定的,老接口的定义是不会变化的,变化的只是接口实现而已,所以直接升级libcurl.so并不会影响现有二进制正常调用libcurl,这就是动态库的优势。

按照动态库的原理,libcurl支持unix socket,也只不过是在curl_easy_setopt的实现里额外支持了选项CURLOPT_UNIX_SOCKET_PATH而已,就实现了新功能的拓展。

另外,运维同学在升级libcurl后发现还是没有生效,这需要我们通过ldd命令查看我们的二进制具体链接的libcurl.so路径:

如果你升级的libcurl.so不是在这个路径,那么你应该拷贝它到链接的路径里去。

 

 

发表评论

电子邮件地址不会被公开。