调用libcurl库访问百度网页 libcurl函数库常用字段解读并设置数据读取回调函数

修改环境变量

export LD_LIBRARY_PATH=要找到的链接库的地址

export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/

编译代码

gcc ceshi.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib -lcurl

在运行后再/tmp/get.html中可以看到百度的页面的代码

libcurl库的使用

调用curl_global_init()初始化libcurl
调用curl_easy_init()得到easy interface型指针
调用curl_easy_setopt()设置参数
根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
调用curl_easy_perform()完成传输任务
调用curl_easy_cleanup()释放内存

curl_global_init()只能使用一次(在curl_easy_cleanup后还可以继续使用)
如果这个函数在curl_easy_init()之前没有使用他将会由lcurl自动调用使用所以为了防止在多线程中每个线程都调用curl_global_init()。

注意:在lcurl中的线程是安全的但在curl_global_init()是不安全的所以不要在每个线程都调用curl_global_init(),所以应该将他放在主线程中调用

curl_global_init(long flag)
flag

CURL_GLOBLA_ALL // 初始化所有可能的调用
CURL_GLOBLA_SSL //初始化支撑安全套接字层
CURL_GLOBLA_WIN32 //初始化win32套接字库 一般用不到
CURL_CLOBLA_NOTHING //没有额外的初始化

curl_easy_init()

curl_easy_init用来初始化一个CURL型的指针,响应的在curl_easy_cleanup函数清理,相当于一个会话的开始,

curl_easy_setop``

 curl_easy_setopt(CURL *handler,CURLoption option,parameter);

``

这个函数最终几乎所有的curl的程序都是频繁的调用这个函数,他告诉curl这个程序将有如何的行为,比如查看一个html的代码
参数

curl类型的指针
各种CURLoption类型的选项(都在curl.h的库中,man也可以查到)
parameter既可以是一个函数指针,也可以是一个long型的变量,具体是什么要看第二个参数使用的什么
OPTION这个参数有很多,可以查看man手册

curl_easy_perform

请求http访问
本节主要介绍curl_easy_setopt中跟http相关的参数。该函数是curl中非常重要的函数,curl所有设置都是在该函数中完成的,该函数的设置选项众多,注意本节的阐述的只是部分常见选项。

CURLOPT_URL

设置访问URL

CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA

回调函数原型为:size_t function( void *ptr, size_t size, size_t nmemb, void *stream); 函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能,如处理下载文件。CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源。

如果你没有通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出。你也可以通过 CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里。

CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA

回调函数原型为 size_t function( void *ptr, size_t size,size_t nmemb, void *stream); libcurl一旦接收到http 头部数据后将调用该函数。CURLOPT_WRITEDATA 传递指针给libcurl,该指针表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。

CURLOPT_READFUNCTION CURLOPT_READDATA

libCurl需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型是:size_t function(void *ptr, size_t size, size_t nmemb,void *stream). CURLOPT_READDATA 表明CURLOPT_READFUNCTION函数原型中的stream指针来源。

CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA

跟数据传输进度相关的参数。CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次,为了使CURLOPT_PROGRESSFUNCTION被调用,CURLOPT_NOPROGRESS必须被设置为false,CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的第一个参数

CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:

CURLOPT_TIMEOUT 由于设置传输时间,CURLOPT_CONNECTIONTIMEOUT 设置连接等待时间

CURLOPT_FOLLOWLOCATION

设置重定位URL

CURLOPT_RANGE: CURLOPT_RESUME_FROM:

断点续传相关设置。CURLOPT_RANGE 指定char *参数传递给libcurl,用于指明http域的RANGE头域,例如:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
CURLOPT_RESUME_FROM 传递一个long参数给libcurl,指定你希望开始传递的 偏移量。

### 回答1: 在Linux C编程中,要接收HTTP POST数据,首先需要建立一个用于监听网络连接的套接字,并绑定到指定的IP地址和端口号上。之后,通过该套接字接收客户端发来的HTTP请求。 接收HTTP POST数据的一种常用方法是通过读取套接字的输入缓冲区来获取数据。可以使用Linux C中的标准IO函数如read()或recv()来读取套接字中的数据。 接收HTTP POST数据的具体步骤如下: 1. 创建一个套接字: 使用socket()函数创建一个套接字,并指定为SOCK_STREAM类型。 2. 绑定IP地址和端口号: 使用bind()函数将套接字绑定到指定的IP地址和端口号上。 3. 监听网络连接: 使用listen()函数监听套接字,等待客户端的连接请求。 4. 接受客户端连接请求: 使用accept()函数接受客户端连接请求,并返回一个新的套接字,用于与客户端通信。 5. 读取HTTP POST数据: 使用read()或recv()函数从套接字中读取HTTP POST数据。根据HTTP协议规定,POST数据通常在HTTP请求头的之后。 6. 处理HTTP POST数据: 对于接收到的HTTP POST数据,可以根据具体需求进行处理、解析或存储。 7. 关闭套接字: 在完成数据处理后,使用close()函数关闭套接字,释放资源。 以上是Linux C接收HTTP POST数据的基本步骤。需要注意的是,在实际应用中还需要考虑网络异常和数据长度等问题,并做相应的错误处理和安全验证。 ### 回答2: 在Linux C中接收HTTP POST数据的过程可以分为以下几个步骤: 1. 创建一个Socket套接字:通过调用socket函数创建一个TCP套接字。 2. 绑定套接字到IP地址和端口:使用bind函数将套接字绑定到一个特定的IP地址和端口上。 3. 监听连接请求:通过调用listen函数,将套接字设置为监听模式,等待来自客户端的连接请求。 4. 接受客户端连接:使用accept函数接受客户端的连接请求,并返回一个新的套接字用于和客户端进行通信。 5. 接收HTTP请求数据:通过新的套接字读取客户端发送过来的数据。由于HTTP请求数据的传输采用TCP协议,可以使用recv函数接收数据。 6. 解析HTTP请求:解析从客户端接收到的HTTP请求数据,获取请求的方法、URL、请求头等信息。 7. 处理POST数据:当请求方法为POST时,从请求头中获取Content-Length字段的值,然后根据该值读取相应长度的数据。通过处理POST数据,可以获取客户端提交的表单数据、文件等。 8. 返回HTTP响应:根据处理POST数据的结果,生成对应的HTTP响应数据,并通过新的套接字将响应数据发送给客户端。 9. 关闭套接字:通信完成后,使用close函数关闭套接字。 以上是大致的步骤,实际过程中还需要对各种错误和异常情况进行处理,例如连接失败、接收数据超时、请求方法不支持等。此外,需要熟悉HTTP协议和Socket编程的相关知识,才能更好地理解和实现上述步骤。这样,就能在Linux C中接收HTTP POST数据了。 ### 回答3: 在Linux下使用C语言接收HTTP POST数据,可以通过搭建一个简单的TCP服务器来实现。 首先,需要创建一个TCP socket,并绑定一个端口号,用于监听客户端的连接请求。然后,使用listen函数开始监听客户端连接。 接下来,使用accept函数接受客户端的连接请求,并使用recv函数从客户端接收数据。在接收数据之前,需要先解析HTTP头部,以获取POST数据的长度。 解析HTTP头部可以通过分析从recv函数接收到的数据来实现。通过查找HTTP头部的Content-Length字段,可以获取POST数据的长度。然后,使用recv函数循环接收指定长度的POST数据。 接收POST数据之后,可以对数据进行处理或解析,根据具体需求来决定如何处理接收到的数据。接收完毕后,可以发送回复给客户端,表示数据接收成功。 最后,使用close函数关闭与客户端的连接,并释放相关资源。 需要注意的是,上述方法是一个简单示例,能够实现基本的接收POST数据的功能,但在实际应用中可能需要更加复杂的处理逻辑,包括错误处理、并发处理等。此外,为了更高效地处理HTTP请求,可以考虑使用第三方,如libcurl、libmicrohttpd等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值