我正在尝试使用OpenSSL实现从C ++通过SSL / TLS发送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.1\n";
FormBuffer << "Host: " << Host << "\n";
FormBuffer << "User-Agent: " << UserAgent << "\n";
FormBuffer << "Content-Type: application/x-www-form-urlencoded\n";
FormBuffer << "Content-Length: " << ContentLength << "\n\n";
FormBuffer << "username=USER&password=PWD\n";
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请求的标头部分发送到服务器,但不发送正文(用于发布的数据)。但是服务器只有在收到并处理了请求正文后才会做出响应。这意味着您从服务器的读取将只是阻塞,因为服务器没有发送任何数据。

09-25 20:58