libcurl的坑

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

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;
	}

双管齐下,否则,不知道啥时候就闪退了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值