curl的http post功能

1.交叉编译curl

1.下载 openssl https://www.openssl.org/source/
$ ./configure CPPFLAGS="-I/opt/xm_toolchain/arm-xmv2-linux/usr/include" LDFLAGS="-L/opt/xm_toolchain/arm-xmv2-linux/usr/lib -lssl -lcrypto" --host=arm-xmv2-linux-uclibcgnueabi CC=/opt/xm_toolchain/arm-xmv2-linux/usr/bin/arm-xmv2-linux-uclibcgnueabi-gcc --with-ssl --enable-static --enable-shared --prefix=$PWD/__install
$ make
$ make install

2.post

/*******************************************************************************
 * Function Name : SendPostData
 * Create Date   : 2020-2-23
 * Description   : 
 * Param         : 
 *                 data
 *                 
 * Return Code   : None
 *******************************************************************************/
int SendPostData(char *data)
{

	CURL *curl;
  	CURLcode res;
    char sign[33]     	= {0};
    char h_detector[50] = "detector:";
    char h_sign[50]     = "sign:";
	char h_timestamp[50]= "timestamp:";

    get_header_sign(Detector ,"25B1CA679B7C2283",sign);

	strcat(h_timestamp,Timestamp);//"timestamp:1611540682"
    strcat(h_detector ,Detector );//detector:RF_50_00000004
    strcat(h_sign     ,"93E562D1242373FC3D0C00F955A4307F" );//sign:93E562D1242373FC3D0C00F955A4307F

	// printf("%s\r\n",h_sign);
	// printf("%s\r\n",h_detector);
	// printf("%s\r\n",h_timestamp);

  	struct curl_slist    *headerlist  = NULL;
   	
  	curl_global_init(CURL_GLOBAL_ALL);
   
	curl = curl_easy_init();
	// 设置http发送的内容类型为JSON
    headerlist = curl_slist_append(headerlist, "Accept:application/json");
    headerlist = curl_slist_append(headerlist, "Content-Type:application/json");
    headerlist = curl_slist_append(headerlist, "charset:utf-8");
	headerlist = curl_slist_append(headerlist, h_detector);
	headerlist = curl_slist_append(headerlist, h_sign);
	headerlist = curl_slist_append(headerlist, "timestamp:1611540682");

	if (curl)
	{
		// 设置超时时间  
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, REV_TIME); 
		//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了
		curl_easy_setopt( curl, CURLOPT_CONNECTTIMEOUT,CON_TIME);
		/* what URL that receives this POST */ 
    	curl_easy_setopt(curl, CURLOPT_URL, STATIC);// 设置url
        // 设置http发送的内容类型为JSON
    	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
		// 设置要POST的JSON数据
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); 
        //设置接收到的数据的缓存地址,
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)recv);
        //setpost 请求 
        curl_easy_setopt(curl, CURLOPT_POST, 1);
        //set 回调函数接受的数据不包含消息头
        curl_easy_setopt(curl, CURLOPT_HEADER, false);
        //设置回调函数,用来接受数据
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
        
		printf("data = %s\r\n",data);

		res = curl_easy_perform(curl);
		/* Check for errors */ 
		if(res != CURLE_OK)
		{
			printf("curl url_easy_perform() failed:%s \n",curl_easy_strerror(res));
			return -1;
		}
		/* always cleanup */ 
		curl_easy_cleanup(curl); 
		/* then cleanup the formpost chain */ 
		//curl_formfree(formpost);
		/* free slist */ 
		curl_slist_free_all (headerlist);
	}
	curl_global_cleanup();
	return 0;
}

3.form post

int SendPostMeassage(char *new, char *fileName, uint formtype){

  	CURL *curl;
  	CURLM *multi_handle;
	struct curl_slist    *headerlist  = NULL;
	struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;
	int still_running = 0;
	printf("data = %s\r\n",new);

  	curl = curl_easy_init();
  	multi_handle = curl_multi_init();
	/* Fill in the file upload field. This makes libcurl load data from
		the given file name when curl_easy_perform() is called. */
    curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "meta_data",
                    CURLFORM_COPYCONTENTS, new,
                    CURLFORM_END);

    if(formtype == PARK_IMG){
        curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "full_image",
                    CURLFORM_FILE,fileName,
                    CURLFORM_END);
        curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "feature_image",
                    CURLFORM_FILE,fileName,
                    CURLFORM_END);

        curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "plate_image",
                    CURLFORM_FILE,fileName,
                    CURLFORM_END);

    }
    else if (formtype == PARK_MDF)
    {
        curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "feature_image",
                    CURLFORM_FILE,fileName,
                    CURLFORM_END);

        curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "plate_image",
                    CURLFORM_FILE,fileName,
                    CURLFORM_END);
    }
    else if (formtype == SNAPSHOT_IMG)
    {
        
        curl_formadd(&formpost,
                    &lastptr,
                    CURLFORM_COPYNAME, "snapshot_image",
                    CURLFORM_FILE,fileName,
                    CURLFORM_END);
    }
    


	// 设置http发送的内容类型为JSON
	headerlist = curl_slist_append(headerlist, "detector:RF_50_00000004");
	headerlist = curl_slist_append(headerlist, "sign:93E562D1242373FC3D0C00F955A4307F");
	headerlist = curl_slist_append(headerlist, "timestamp:1611540682");
	
	if(curl && multi_handle) {
		
		// 设置超时时间  
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, REV_TIME); 
		//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了
		curl_easy_setopt( curl, CURLOPT_CONNECTTIMEOUT,CON_TIME);
		/* what URL that receives this POST */
        if(formtype == PARK_IMG){
            curl_easy_setopt(curl, CURLOPT_URL, IN_OUTIMAGEURL);
        }
        else if (formtype == PARK_MDF)
        {
            curl_easy_setopt(curl, CURLOPT_URL, CHACKURL);
        }
        else if (formtype == SNAPSHOT_IMG)
        {
            curl_easy_setopt(curl, CURLOPT_URL, TIMEUPURL);
        }
        
        
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        //set 回调函数接受的数据不包含消息头
        
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
		curl_easy_setopt(curl, CURLOPT_HEADER, false);
		curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
        //设置回调函数,用来接受数据
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

		curl_multi_add_handle(multi_handle, curl);

		curl_multi_perform(multi_handle, &still_running);

		while(still_running) {

			struct timeval timeout;
			int rc; /* select() return code */
			CURLMcode mc; /* curl_multi_fdset() return code */

			fd_set fdread;
			fd_set fdwrite;
			fd_set fdexcep;
			int maxfd = -1;

			long curl_timeo = -1;

			FD_ZERO(&fdread);
			FD_ZERO(&fdwrite);
			FD_ZERO(&fdexcep);

			/* set a suitable timeout to play around with */
			timeout.tv_sec = 1;
			timeout.tv_usec = 0;

			curl_multi_timeout(multi_handle, &curl_timeo);
			if(curl_timeo >= 0) {
				timeout.tv_sec = curl_timeo / 1000;
				if(timeout.tv_sec > 1)
					timeout.tv_sec = 1;
				else
					timeout.tv_usec = (curl_timeo % 1000) * 1000;
			}

			/* get file descriptors from the transfers */
			mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);

			if(mc != CURLM_OK) {
				fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
				break;
			}

			/* On success the value of maxfd is guaranteed to be >= -1. We call
				select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
				no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
				to sleep 100ms, which is the minimum suggested value in the
				curl_multi_fdset() doc. */

			if(maxfd == -1) {
		#ifdef _WIN32
				Sleep(100);
				rc = 0;
		#else
				/* Portable sleep for platforms other than Windows. */
				struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
				rc = select(0, NULL, NULL, NULL, &wait);
		#endif
			}
			else {
				/* Note that on some platforms 'timeout' may be modified by select().
				If you need access to the original value save a copy beforehand. */
				rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
			}

			switch(rc) {

				case -1:
					/* select error */
					break;
				case 0:

				default:
					/* timeout or readable/writable sockets */
					//printf("perform!\n");
					curl_multi_perform(multi_handle, &still_running);
					//printf("running: %d!\n", still_running);
					break;
				}
		}
		curl_multi_cleanup(multi_handle);

    	/* always cleanup */
    	curl_easy_cleanup(curl);

    	/* then cleanup the formpost chain */
    	curl_formfree(formpost);

    	/* free slist */
    	curl_slist_free_all(headerlist);
	}
	curl_global_cleanup();

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值