1) linux64下long是8字节,windows是4字节,
所以这里,必须是long,如果是int 在windows下好好的,结果linux越界了,结束时候会造成segment fault. 查了一个小时,最后还是别人遇到过。
long status;
CURLcode ret = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
2)屏蔽CURL信号,否则会超时退出。
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
但是,如果设置了,禁止信号,当出现网络状况不好,解析超时时,就会卡死,需要一个靠谱的优雅的DNS方式:CentOS编译安装libcurl/curl添加异步DNS解析c-ares - 海运的博客
这样就必须要在编译时候开启相关选项:
install c-ares-devel
然后,编译时开启ares选项
./configure --prefix=/usr/local/curl --enable-ares --with-openssl=/usr/local/openssl301
make -j4
make install
在代码中可以添加检测:
curl_version_info_data *info = curl_version_info(CURLVERSION_NOW);
if (info->features & CURL_VERSION_ASYNCHDNS)
{
printf("ares enabled\n");
}
else
{
printf("ares NOT enabled\n");
}
3)这还不算完,因为还可能遇到SSL,在遇到连接被对方无理关闭时,会收到Broken PIPE信号,程序还是会闪退的!!!
参考:linux下网络程序遭遇SIGPIPE的解决(转)_Milu_Jingyu的博客-CSDN博客_linux sigpipe
需要在main中添加如下代码:
signal(SIGPIPE, SIG_IGN);
// 防止线程中出现此类信号
sigset_t signal_mask;
sigemptyset (&signal_mask);
sigaddset (&signal_mask, SIGPIPE);
int rc = pthread_sigmask (SIG_BLOCK, &signal_mask, NULL);
if (rc != 0)
{
cout << WarningMsg<string>("block sigpipe error, exit here\n");
return -1;
}
双管齐下,否则,不知道啥时候就闪退了;

本文探讨了使用CURL库在不同操作系统(Linux与Windows)间进行网络请求时遇到的问题,包括long类型大小差异导致的内存越界、CURL信号处理不当引发的超时退出以及SSL连接异常关闭时的程序崩溃。文章提供了详细的解决方案,如正确选择数据类型、屏蔽CURL信号及使用异步DNS解析等。

556

被折叠的 条评论
为什么被折叠?



