提问人:Display Name 提问时间:6/18/2014 最后编辑:Display Name 更新时间:6/19/2014 访问量:3121
SSL_accept() 不工作
SSL_accept() Not Working
问:
我已经研究了一段时间,但在任何地方都没有看到完全相同的问题。我只是遇到了一个具体的、非常简单的问题:每当我的echo_server尝试运行函数时,它都不会阻止等待客户端连接的服务器,函数只会返回 0,如果我进入,它会给我,所以我猜问题是,引用手册中的一句话,“观察到违反协议的 EOF。SSL_accept()
SSL_get_error()
SSL_ERROR_SYSCALL
事实是,我不知道这意味着什么,这真的很令人沮丧,因为我认为我错过了一些非常简单的东西,但我不知道是什么。
这是我的接受函数的代码(SSL_ctx之前初始化并打开了套接字):
SSL * sslconnection;
if((sslconnection = SSL_new(ctx)) == NULL){
return NULL;
}
if(SSL_set_fd(sslconnection, socketd) != 1){
return NULL;
}
if(SSL_accept(sslconnection) != 1){
return NULL;
}
return sslconnection;
另外,我尝试使用“openssl verify -verbose -purpose sslserver -CAfile 'CACertificate' 'ServerCertificate'”检查我的证书,但它会说我的服务器证书没问题。
欢迎任何帮助,提前致谢。希望这是一件非常愚蠢的事情,我只是太模糊了,我看不到它。
答:
7赞
Maxim Egorushkin
6/18/2014
#1
每当我的echo_server尝试运行 SSL_accept() 函数时,它都不会阻止等待客户端连接的服务器
SSL_accept
不召唤你。它期望已经调用了。accept
accept
正确的调用顺序是:
socket
bind
listen
accept
SSL_new
SSL_set_fd
SSL_accept
从 https://www.openssl.org/source/ 下载 openssl 源代码并查看 demos/ssl/serv.cpp。
评论
0赞
Display Name
6/18/2014
你救了我的命!在调用 accept() 并且服务器被阻止后,您怎么可能仍然可以执行诸如 SSL_new() 之类的操作?不会被屏蔽吗?或者这就是目的?我的意思是,在找到新连接之前阻止它,然后执行SSL部分?
0赞
Maxim Egorushkin
6/18/2014
@DisplayName 返回后,您有一个新的客户端连接,并且操作系统开始在后台接收来自客户端的数据(如果有)到内核套接字缓冲区中,您最终将使用 // 读取这些数据。accept
read
recv
recvmsg
评论