C 是否有 HTTP2 的标准库

问题描述

[介绍]]

我每周练习 C 语言 4 个月 5 次,我正在尝试为进入 HTTP2 的 Web 服务器/客户端编程做出最好的猜测。我使用过 HTML5 和 Javascript 我也使用过 HTTP2 并且在低级别使用过 SPDY。

[信息]

Debian GNU/Linux (Buster),V.10

                    

编译器 - Clang
标头 HTTP2(?)
HTTP 头文件(sys/socket.h、sys/types.h、signal.h、arpa/inet.h) 网络协议 - TCP、HTTP2、HTTP。

[问题]

在使用 Java 时,您会注意到游戏引擎中使用了大量 HTTP2。到 2021 年,HTTP2 在当前语言中的标准化程度越来越高。(重点->)C 有一个标准库,可用于 HTPTCP
HTTP2 使用加密,据我所知基于“TCP”。 C 是否有使用“HTTP2 TCP”类型的标准。我需要能够从 HTTP2 读取文本并轻松执行任务(send()、recv().(

[最终]
我可以使用 C 标准 POSIX 库实际开发 HTTP2 程序吗? 我将如何在 C 中使用 HTTP2 以及它是否可行。

解决方法

HTTP 是一种协议。它定义了计算机相互通信的方式。有很多不同的协议; HTTP/2 和 HTTP 基于 TCP/IP,几乎所有计算机都使用 TCP/IP 连接到服务器。 TCP/IP 指定如何在客户端和特定服务器之间创建连接,并发送原始字节。 HTTP(2) 是在这之上的一层,它定义了客户端应该如何告诉服务器它想要什么资源。

基础 POSIX 提供的 API 仅扩展到原始 TCP/IP。下面是一个应用程序可以发送到网络服务器以请求网页的示例(这是一个 HTTP/1 请求,HTTP/2 是二进制和加密的,使其不可读)

GET /somepage HTTP/1.0
Host: example.com

但是,在程序中手动组装这些请求有点不方便,尤其是当您开始执行发送参数、加密等操作时。在这种情况下,人们应该使用机器上的一些库。重要的是这些是非标准的。可能最常见的一种是 libcurl

Here's a libcurl tutorial。总结一下:

您可以通过向编译器和链接器提供一些标志来使用 libcurl 编译您的程序。您可以通过运行 curl-config --cflagscurl-config --libs 来获得这些。

使用 curl_global_init(bitfield) 初始化 libcurl。位域可以将 CURL_GLOBAL_WIN32CURL_GLOBAL_SSL 作为其值。您可能需要 CURL_GLOBAL_SSL,因为您想使用加密。

libcurl 有两个接口:easymulti。我要报道easy

通过调用 curl_easy_init() 获得简单的操作。此句柄允许您发出请求。

使用 curl_easy_setopt(handle,option,value) 在手柄上设置选项。 handle 是您获得的“简单句柄”,option 是一个常量 - 例如 CURLOPT_URL 用于设置要请求的 URL - 而 value 是您要设置的值它到。它通常是一个字符串。

option 设置为 CURLOPT_WRITEFUNCTION 的回调函数。它应该具有签名 size_t(void *buffer,size_t size,size_t nmemb,void *userp)。当 libcurl 从服务器接收数据时调用它。通常,它会被多次调用。 nmemb 指出 buffer 中数据的大小。它应该返回它成功处理的字节数。通常这是 nmemb

使用 curl_easy_perform(handle) 执行请求。

当您完成您想要提出的每个请求后,调用 curl_global_cleanup()

,

C standard library 中没有专门用于 http2 的部分。

然而,在 http2 中使用 C 绝对是可能的,有据可查并被广泛使用。例如:

  1. curl - 信息:https://curl.se/docs/http2.html
  2. nghttp2

可以在此处找到有关 http2 和各种编程语言的更多信息:https://github.com/httpwg/http2-spec/wiki/Implementations