- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用套接字用 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/
如果我使用open ssl命令 sudo openssl genrsa -out privkey.pem 2048 要生成rsa key ,它仅生成1个文件。这是私钥。我如何获得公钥。 最佳答案 回答
三个不同版本的 openssl 正在同时更新 openssl.org : 0.98, 1.0.0, 1.0.1?它们之间有什么区别,我该如何选择要使用的版本? 最佳答案 https://en.wiki
我有以下命令用于 OpenSSL 生成私钥和公钥: openssl genrsa –aes-128-cbc –out priv.pem –passout pass:[privateKeyPass] 2
我正在尝试使用对应的 gcc (arm-none-eabi-5_4-2016q2) 为 cortex m3 机器交叉编译 openssl。机器应该有能力做 TCP 请求,我们希望在一天结束时做 HTT
我正在尝试使用 openssl dsa 实现,但我对以下细节感到非常困惑: 命令 openssl dsa .... 的选项“-text”:输出中的十六进制数字,我是否正确地假设这些是字节,因此它们是按
我正在尝试制作一个假 CA 并用它签署一个证书以与 stunnel 一起使用(这似乎只是调用 OpenSSL 例程,因此您可能不需要了解该程序来提供帮助:)。然而,stunnel 一直拒绝我的证书,说
不幸的是,Perl 在尝试安装 OpenSSL 的手册页(例如 OpenSSL_1_0_1g)时不知何故遇到了错误。因为我不需要它们 - 我只想使用 OpenSSL 作为 C 库,我想我可以通过完全跳
OpenSSL 中的 BIO 对到底是什么?它的用途是什么?我已经检查过 OpenSSL 文档,但任何细节都很少。 最佳答案 OpenSSL 中的 BIO 类似于文件句柄。您可以使用一对它们来安全地相
openssl ca 和 openssl x509 命令有什么区别?我正在使用它来创建和签署我的 root-ca、intermed-ca 和客户端证书,但是 openssl ca 命令不会在证书上注册
如何(如果有的话)为 OpenSSL 定义一个单一的可信证书文件在 Windows(Win-7,OpenSSL 1.0.1c)上使用 SSL_CERT_FILE 环境变量? 各种研究促使我下载了 Mo
我有一个自签名证书,其中显示了列出的基本约束,但从中生成的签名请求不显示这些属性,例如 [v3_req]。我怎样才能让它可见?我正在使用 openssl 生成证书。 场景: 我使用以下方法创建自签名证
这个问题在这里已经有了答案: Check if a connection is TLSv1 vs SSLv3 (SSL_CIPHER_description/SSL_CIPHER_get_name)
是否有更简单的方法来确定在构建 openssl 期间指定的选项,例如当时是否定义了 OPENSSL_NO_SRTP? 我只能从以下方面获得有限的信息: openssl 版本 -a 命令。但是,如果我只
我们正在与 AWS Nitro 合作,仅提供 3 小时的证书。 我们正在寻找一种可以跳过验证中的过期部分并仍然确认证书链有效的方法。 最佳答案 根据 openssl-verify 文档
嗨,我如何在 Easyphp 中启用 openssl,因为我收到错误消息无法发送。Mailer 错误:缺少扩展:opensslTime:使用 phpmailer 时。谢谢 最佳答案 在您的 php.i
我正在尝试以编程方式读取 OpenSSL 警报消息,但无法找到执行此操作的方法。 OpenSSL API 提供如下功能: const char *SSL_alert_type_string(int v
我跑了openssl speed在我的 Ubuntu 计算机上。一些结果: Doing md4 for 3s on 16 size blocks: 9063888 md4's in 3.00s Doi
我编译了带有cryptodev支持(即硬件加速)的OpenSSL,但不幸的是默认引擎仍然是软件。 time openssl speed -evp aes-128-cbc -engine cryptod
我需要从 RedHat Linux 服务器连接到 Microsoft Dynamics CRM 服务器。地址是xxx.api.crm4.dynamics.com。服务器接受 TLSv1 但不接受 1.
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 上个月关闭。 Improve thi
我是一名优秀的程序员,十分优秀!