簡體   English   中英

SSL_read未收到

[英]SSL_read not receiving

我正在嘗試通過SSL連接到安全服務,但是在以下代碼中, SSL_read永不返回,如果服務器不返回任何消息,這當然是正常的行為,但是我嘗試連接的服務器應該返回某種信息。 下列內容是否有不允許閱讀的內容?

//Initialize SSL library
OpenSSL_add_ssl_algorithms();
//Initialize Crypto algorithms
OpenSSL_add_all_algorithms();

//Create new SSL context accepting SSL V2, V3 or TLS V1.0, V1.1 and V1.2
const SSL_METHOD *method = SSLv23_client_method();
SSL_CTX *ctx = SSL_CTX_new(method);
if (ctx == NULL)
{
    printf("Error initializing SSL context.\n");
    return 0;
}
SSL *ssl = SSL_new(ctx);
//Create socket descriptor
int sd = 0;
//Create hints for connection
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;//Can be both IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo * result;
//Get address info, this could potentially return multiple
int err = getaddrinfo("api.okcoin.com", "9880", &hints, &result);
if (err != 0)
{
    printf("Could not get addr info.\n");
    return 0;
}
//Try connecting to any of the returned addresses
struct addrinfo * res;
for (res = result; res != NULL; res = res->ai_next)
{
    sd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sd == -1)
    {
        printf("Could not connect to host.\n");
        return 0;
    }
    if (connect(sd, res->ai_addr, res->ai_addrlen) == 0)
    {
        //Socket is now connected, free addrinfo results
        freeaddrinfo(result);
        //Assign socket descriptor to SSL
        if (SSL_set_fd(ssl, sd) == 0)
        {
            printf("Could not assign socket descriptor.\n");
            return 0;
        }
        //Begin SSL-handshake
        if(SSL_connect(ssl) == 0)
        {
            printf("Could not perform handshake.\n");
            return 0;
        }
        break;
    }
}
//Could not connect socket, free addrinfo results and return error
if (res == NULL)
{
    printf("Could no connect to to any host.\n");
    freeaddrinfo(result);
    return 0;
}
printf("Connected.\n");

SSL_write(ssl, "HELLO\x01", 6);
char * m = malloc(8192);
SSL_read(ssl, m, 8192);

由於沒有錯誤檢查,因此您無法知道SSL_write()是否成功,更不用說SSL_read()被阻止的原因了。 您不能隨時編寫這樣的代碼,更不用說處理網絡或SSL了。

用等效的Java程序得到的是一個不受信任的服務器證書錯誤。 修復該問題后,我在60秒后收到讀取超時。

我的結論是,這里的錯誤不是您的代碼,而是請求格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM