如何解析C语言中基于HTTP的text/event-stream响应,其中包含多条data: 数据段?
时间: 2024-11-03 19:13:31 浏览: 22
解析C语言中基于HTTP的`text/event-stream`响应需要使用到网络编程库(如libcurl或socket API)来获取数据流,并通过循环读取和处理每一行数据。`text/event-stream`格式通常会按照这样的模式发送:
```
data: some-2\n
...
more: \n
```
这里的`\n`表示换行符,`data:`前的数据块是一条独立的消息。
以下是简单的步骤概述:
1. **建立连接**:使用库函数打开到服务器的连接,设置适当的请求头,例如`Accept: text/event-stream`。
2. **接收数据**:开启一个长轮询或者使用持续读取(如果支持),比如libcurl的`curl_easy_recv()`函数。
3. **解析每一行**:当接收到数据时,逐行检查内容,遇到`data:`开头的行,就提取出数据部分。
4. **处理数据**:将提取的数据作为独立事件处理,可以存储、分析或转发。
5. **处理分隔标志**:遇到`more:`或`\n\n`等分隔符,表示新的一轮消息开始。
6. **循环接收**:继续监听新的数据流,直到连接关闭或达到预期结束条件。
```c
size_t read_callback(char* ptr, size_t size, size_t nmemb, void* userp) {
// 这里处理从服务器返回的数据,找到"data:"行并提取数据
}
// 使用libcurl示例
curl_global_init(CURL_GLOBAL_DEFAULT);
CURLcode res;
CURL *curl;
FILE *fp;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "your_url_here");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, read_callback); // 自定义回调函数
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &fp); // 文件指针指向文件用于保存头部信息
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
```
阅读全文