gpt4 book ai didi

C HTTP 服务器和 OpenSSL - 适用于 HTTP - 使用 HTTPS 丢弃多个/快速/并发连接

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:55 24 4
gpt4 key购买 nike

我正在使用套接字用 C 编写一个 HTTP 服务器。它可以监听多个端口,并在每个端口 1 个线程的基础上运行以运行监听循环,每个循环生成另一个线程来传递响应

该代码在传递标准 HTTP 响应时完美运行。我将它设置为响应一个带有 JavaScript 代码的 HTML 页面,该代码只是反复刷新浏览器以对服务器进行压力测试。我已经用我的计算机作为服务器运行并同时向它发送请求的 4 个其他设备对此进行了测试。

没有崩溃,没有掉线,也没有内存泄漏。在 HTTP 模式下运行 2.0 GHz Intel Core 2 Duo 且有 4 个设备发送垃圾请求时,CPU 使用率永远不会超过 5%。

我昨天刚刚添加了 OpenSSL,因此它可以通过 HTTPS 提供安全响应。这进行得相当顺利,因为看起来我所要做的就是将一些标准套接字调用替换为安全模式的 OSSL 对应调用(基于这个问题的解决方案:Turn a simple socket into an SSL socket)。

每个连接有一个 SSL 上下文和 SSL 结构。它确实有效但不是很可靠。同样,每个响应都在其自己的线程上发生,但安全模式下的多个/快速/并发请求似乎是随机丢弃的,尽管我的代码中仍然没有崩溃或内存泄漏。

当连接断开时,浏览器会说它正在等待从未发生过的响应(Chrome),或者只是说连接已重置(Firefox)。

作为引用,这里是更新的连接创建和关闭代码。

连接创建代码(监听循环的主要部分):

// Note:    sslCtx and sslConnection exist
// elsewhere in memory allocated specifically
// for each connection.

struct sockaddr_in clientAddr; // memset-ed to 0 before accept
int clientAddrLength = sizeof(clientAddr);

...

int clientSocketHandle = accept(serverSocketHandle, (struct sockaddr *)&clientAddr, &clientAddrLength);

...

if (useSSL)
{
int use_cert, use_privateKey, accept_result;

sslCtx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_set_options(sslCtx, SSL_OP_SINGLE_DH_USE);

use_cert = SSL_CTX_use_certificate_file(sslCtx, sslCertificatePath , SSL_FILETYPE_PEM);
use_privateKey = SSL_CTX_use_PrivateKey_file(sslCtx, sslCertificatePath , SSL_FILETYPE_PEM);

sslConnection = SSL_new(sslCtx);
SSL_set_fd(sslConnection, clientSocketHandle);

accept_result = SSL_accept(sslConnection);
}

... // Do other things and spawn request handling thread

连接关闭代码:

int recvResult = 0;

if (!useSSL)
{
shutdown(clientSocketHandle, SHUT_WR);

while (TRUE)
{
recvResult = recv(clientSocketHandle, NULL, 0, 0);
if (recvResult <= 0) break;
}
}
else
{
SSL_shutdown(sslConnection);

while (TRUE)
{
recvResult = SSL_read(sslConnection, NULL, 0);
if (recvResult <= 0) break;
}

SSL_free(sslConnection);
SSL_CTX_free(sslCtx);
}


closesocket(clientSocketHandle);

同样,这对 HTTP 响应 100% 完美。 HTTPS 响应可能出了什么问题?

更新

我已经为多线程环境使用 OpenSSL 回调更新了代码,服务器使用来自以下问题答案的代码稍微更可靠:OpenSSL and multi-threads .

我写了一个小的命令行程序,用 HTTPS 请求向服务器发送垃圾邮件,并且它没有丢弃任何同时运行的 5 个多个实例的连接。多个 Firefox 实例似乎也没有断开任何连接。

然而有趣的是,现代基于 WebKit 的浏览器仍然会断开连接。 Chrome 在垃圾邮件发送不到 30 秒时开始断开连接,iPhone 4 (iOS 5.1) 上的 Safari 很少刷新 3 次后才说连接断开,但 iPad 2 (iOS 5.0) 上的 Safari 似乎处理时间最长但最终也会断开连接。

最佳答案

您应该在请求处理线程中调用 SSL_accept()。这将允许您的监听线程更快地处理 TCP 接受/监听队列,并减少新连接因接受/监听队列已满而从 TCP 堆栈获得重置的机会。

SSL 握手是计算密集型的。我猜你的垃圾邮件发送者可能没有使用 SSL session 缓存,所以这会导致你的服务器使用最大数量的 CPU。这将导致它在为其他连接或新传入连接提供服务时出现 CPU 匮乏。

关于C HTTP 服务器和 OpenSSL - 适用于 HTTP - 使用 HTTPS 丢弃多个/快速/并发连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18688132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com