【发布时间】:2018-03-08 08:14:22
【问题描述】:
我正在用 C++ 开发一个简单的 FTPS 客户端。控制通道通信在 SSL 上工作得很好,但我在检索文件列表时遇到了问题。目前我正在执行以下顺序:
open control connection
AUTH TLS
do handshake on control connection
USER username
PASS password
PBSZ 0
PROT P
EPSV
open data connection
TYPE A
LIST
read data connection
如果我尝试直接创建 ssl 连接(在开放数据连接阶段),创建连接会失败。如果我创建连接但仅在发送 LIST 命令后才执行握手,则握手成功但客户端不会从服务器接收任何数据。这是我的数据连接打开逻辑(1 用于直接 ssl,2 用于按需握手):
SSL* ssl;
BIO* bioSsl;
int err;
SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1) err = BIO_new_ssl_connect(ctx);
2) err = BIO_new_connect(host.c_str());
err = BIO_do_connect(bio);
2) bioSsl = BIO_new_ssl(ctx, 1);
2) bio = BIO_push(bioSsl, bio);
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
读取数据连接是使用 BIO_read() 函数完成的。它总是返回 0(注意:我可以通过这种方式读取控制套接字并接收数据)。现有客户端能够从服务器检索文件列表,因此问题不在服务器端。谁能解释发生了什么,我在序列中做错了吗?如果在 LIST 命令之前启动,为什么数据连接上的握手会失败?任何其他建议也很感激!
【问题讨论】:
-
嗯。你如何管理你的多个套接字?
select?这有点像SSL_pending/select问题。