MS VC++ OpenSSL SSL_read() blocking

MS VC++ OpenSSL SSL_read() blocking

本文关键字:blocking read VC++ OpenSSL SSL MS      更新时间:2023-10-16

我正在尝试使用OpenSSL实现通过SSL/TLS从C 发送HTTP-POST请求。除SSL_read()零件外,以下实现有效。SSL_write()成功返回已发送字节的数量,但是SSL_read()只是阻止了程序执行。

任何想法怎么了?

SSL_CTX *ctx;
SSL *ssl;
char buf[1024];
int server, bytes, recv;
SSL_library_init();
ctx = InitCTX();               // Custom Function   
server = OpenConnection();     // Custom Function
ssl = SSL_new(ctx);
SSL_set_fd(ssl, server);
ostringstream FormBuffer;
FormBuffer << "POST " << FormAction << " HTTP/1.1n";
FormBuffer << "Host: " << Host << "n";
FormBuffer << "User-Agent: " << UserAgent << "n";
FormBuffer << "Content-Type: application/x-www-form-urlencodedn";
FormBuffer << "Content-Length: " << ContentLength << "nn";
FormBuffer << "username=USER&password=PWDn";
const auto str = FormBuffer.str();
if (SSL_connect(ssl) != -1)
{
    bytes = SSL_write(ssl, str.data(), str.length());
    recv = SSL_read(ssl, buf, sizeof(buf)); // <--- BLOCKING !!!
    ...
    SSL_free(ssl);
}

这与SSL无关。您将POST请求的标题部分发送到服务器,而不是主体(用于发布的数据)。但是服务器只有在收到并处理请求正文后才做出响应。这意味着您从服务器读取的读取将仅阻止,因为服务器没有发送数据。