- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我自己实现了一个使用 openssl 的网络服务器。
我在 OSX 上使用 SSL_write
的阻塞版本传输数据和最新的 Safari。
我的逻辑是这样的:
num_bytes = 0;
while( num_bytes < bytes_to_send) {
int n = SSL_write(...);
if (n <= 0) {
... // Handle error, break loop
}
num_bytes += n;
}
// Close the socket
我遇到一个不常见的问题,Safari 报告加载资源失败:网络连接丢失。
当我在 Safari 下的开发人员面板中检查资源时,它显示接收到的字节数少于预期。
我已经调试了我的代码并确定 SSL_write
正在报告在我关闭连接之前所有字节都已传输。
当我不关闭连接时,此错误不再出现。
这使我得出以下结论:
SSL_write
错误地报告了在实际发生之前已成功传输的字节数,并且在缩短传输时间后立即关闭连接。
我说的对吗,还是我遗漏了有关 SSL_write
的详细信息?
更新:
在检查了我处理 SSL_shutdown
的方式后,我看到报告了几个 SSL_ERROR_SYSCALL
错误。这可能与我的问题有任何关系,也可能没有任何关系,因为这些错误不会在受影响的 http 传输后直接返回。奇怪的是,在受影响的 http 传输期间,SSL_shutdown
除了阻止调用的重试错误之外没有报告任何错误。
关机代码
// First shutdown SSL
SSL_CTX_free(ctx);
if (SSL_shutdown(ssl) == 0) {
// Call SSL Shutdown again
SSL_shutdown(ssl);
}
SSL_free(ssl);
// Now shutdown port
struct linger linger;
linger.l_onoff = 1;
linger.l_linger = 10;
setsockopt(socket, SOL_SOCKET, SO_LINGER, (char *)&linger,
sizeof(linger));
shutdown(socket, SHUT_WR);
while(recv(...) > 0) { }
closesocket(socket);
更新#2
我设置了带有 ssl 解密的 wireshark 来捕获错误。这是它的样子:
注意第一条绿线,它显示了来自 Safari 的 PatientSearch.js
的 HTTP 请求。现在第二条绿线显示了来 self 的网络服务器的 HTTP 响应。此响应包含整个文件,后跟断开连接协议(protocol)。
更新 #3
这越来越神秘了。在检查成功传输的 wireshark 跟踪后,成功传输与中断传输的协议(protocol)模式没有区别。现在完全糊涂了。
最佳答案
您的发送循环没有正确跟踪发送的字节数。它应该看起来更像这样:
unsigned char *data = ...;
while (bytes_to_send > 0) {
int num_sent = SSL_write(ssl, data, bytes_to_send);
if (num_sent <= 0) {
// handle error as needed...
break;
}
data += num_sent;
bytes_to_send -= num_sent;
}
// Close the socket
或者这个:
unsigned char *data = ...;
int num_total_sent = 0;
while (num_total_sent < bytes_to_send) {
int num_sent = SSL_write(ssl, &data[num_total_sent], bytes_to_send - num_total_sent);
if (num_sent <= 0) {
// handle error as needed...
break;
}
num_total_sent += num_sent;
}
// Close the socket
更新:
SSL_write incorrectly reports a number of bytes were successfully transferred before it has actually occurred
返回值报告它从您那里接受的字节数。这并不能保证这些字节实际上已经传输了。它们被加密并用于创建传出 SSL 帧,该帧位于底层套接字的出站缓冲区中,等待内核在后台实际传输它。该传输可能需要一些时间,特别是如果在套接字上启用了 Nagle 算法(通常默认情况下)。
closing the connection immediately after cuts the transfer short.
这是可能的,具体取决于您关闭连接的方式、套接字的延迟选项的配置方式等。默认情况下,优雅地关闭套接字应该允许内核在后台花费一些额外的时间来写出任何在它之前等待数据然后实际关闭连接。您通常必须采取额外措施来改变这种行为。
关于c++ - SSL_write 报告成功但在 Safari 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36207378/
我正在尝试将 OpenSSL 添加到 epoll 中,并且套接字处于非阻塞模式。令我困惑的一个问题是:由于 SSL 重新协商,SSL_read 可能会产生 SSL_ERROR_WANT_WRITE ,
int SSL_write(SSL *ssl, const void *buf, int num); result = SSL_write(pSsl, buf, 8); 如果结果大于0,是否可以小于8
我用 C 编写了一个小的 HTTPS 客户端,但我在 SSL_write 函数方面遇到了问题。三个测试来说明我的问题: #define HEADERS1 "GET / HTTP/1.1\r\n" #d
我正在尝试使用 OpenSSL (1.1.1)。但在写作过程中,我得到了写作失败(从 ERR_print_errors 获得)。握手成功(返回1)。我也在尝试将其限制为 TLS 1.3 #includ
如何检查是否可以使用 SSL_write() 写入 SSL 流? 我需要类似的东西 if(SSL_write_possible(ssl)) SSL_write(); 最佳答案 看起
下面的描述是关于int SSL_write(SSL *ssl, const void *buf, int num): When an SSL_write() operation has to be r
我编写了一个使用 OpenSSL 进行 SSL/TLS 的网络服务器。服务器发送和接收大数据 block 并在其间执行各种转换。出于性能原因,转换主要使用 vector 信息(请参阅 POSIX 中的
我自己实现了一个使用 openssl 的网络服务器。 我在 OSX 上使用 SSL_write 的阻塞版本传输数据和最新的 Safari。 我的逻辑是这样的: num_bytes = 0; while
我正在开发一个客户端应用程序,该应用程序使用 OpenSSL 使用非阻塞 I/O 进行 TLS。连接的双方都可以随时写入,表明某些状态发生变化。因此,我需要定期检查套接字以获取可用的新数据。如果没有收
是否可以使用 SSL_write 和 SSL_read 发送和接收结构? 客户端 typedef struct{ unsigned int userid; unsigned i
我知道在 OpenSSL API 中禁止在同一 SSL 上下文中从两个不同的线程调用 SSL_read 和 SSL_write,但它是在我的应用程序中重要的是要有安全的全双工通信。我想到了一些解决方案
我有两个应用程序通过 SSL 相互通信。客户端在 windows 机器上运行,服务器是基于 linux 的应用程序。客户端在启动时向服务器发送大量数据。数据以约 4000 字节的 block 发送到包
我正在尝试使用 PHP 脚本连接到服务器。服务器由 SSLv3 设置,我想也许我需要使用 SSL_Write() 来处理将发送到服务器的消息。但是我没有在PHP中找到相关的功能。所以,我想知道我应该使
我计划在执行读取或写入操作之前使用 SSL_want 调用,这样我们就可以避免像 WANT_READ 或 WANT_WRITE 这样的 SSL 错误。请提供您的建议。 最佳答案 不是这样的。 SSL_
我已经用 C 编写了一个基于事件的网络库,现在我想通过 OpenSSL 添加 SSL/TLS 支持。而不是使用 SSL_read() 和 SSL_write(),我宁愿让 OpenSSL 只执行传出/
免责声明,我是 Golang 的新手,因为我使用以下文章作为此 https://blog.gopheracademy.com/advent-2015/libc-hooking-go-shared-li
我已经完成了我的工作,我想将其推送到我在github上的仓库 但推送失败,并显示以下错误: error: RPC failed; curl 55 SSL_write() returned SYSCAL
我的程序是基于OpenSSL(阻塞模式)开发的,我想将它重构为非阻塞的。它在具有 SSL 对象的线程中调用 SSL_read(),并在具有相同对象的另一个线程中调用 SSL_write()。 我从书"
我有一个客户端程序,它使用基于消息的协议(protocol)与服务器通信。每个请求都匹配 1 个或多个响应。 多个请求可以同时在一个套接字上排队,并且 I/O 使用非阻塞 I/O 在单独的线程上完成。
完整的信息列表 Counting objects: 1945, done. Delta compression using up to 8 threads. Compressing objects:
我是一名优秀的程序员,十分优秀!