尽管远端已关闭,但SSL_write不会失败

时间:2018-10-30 16:22:21

标签: c++ linux ssl tcp openssl

我正在使用SSL写入的ssl连接。如果关闭此连接的另一端,则SSL_write返回我写入的字节数,而不是-1。对于下一次写入,它返回-1,但为时已晚,我想从第一个数据包中了解此信息。 对于服务器,我正在使用

openssl s_server -accept 1115 -cert ~/.cert/cert.pem -key ~/.cert/key.pem 

要测试,我发送了3个数据包,每个数据包之间的间隔时间为5秒。如果我在发送第二个数据包之前杀死了s_server,SSL_write将为第二个数据包返回正数,为第三个数据包返回-1。客户端是用C编写的。整个应用程序更复杂,但是我基本上要做的是:

/* connection init */
sock = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,1,...);
connect(sock, ...);

ctx = SSL_CTX_new(TLS_client_method());
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3);
ssl = SSL_new(ctx);
SSL_set_fd(ssl, sockfd);
SSL_connect(ssl);

/* and in the write function */
SSL_write(ssl, buffer, len);

我在Linux Mint 18.3 Sylvia上使用openssl 1.0.2g。是否有任何原因导致SSL_write在远端失效时不返回-1?我唯一解决此问题的方法是启用keepalive,但此方法无效。

0 个答案:

没有答案