2010-09-03 134 views
3

我试图创建一个客户端/服务器程序,但我发现一些困难继续与不幸的稀疏量的OpenSSL文档继续。SSL_accept()抛出“无效参数”错误

我的问题: SSL_accept抛出一个“无效参数”在执行以下代码(简化):

SSL* ssl = SSL_new(ctx); // ctx is created earlier 
SSL_set_fd(ssl, socket); // socket is created earlier as well 
BIO * bio = BIO_new(BIO_s_accept()); 
BIO_set_fd(bio, socket, BIO_NOCLOSE); 
SSL_set_bio(ssl, bio, bio); 
SSL_accept(ssl); 

我检查错误,每个方法调用后,与没有插座,也不是生物变坏。没有迹象表明,直到我尝试调用SSL_accept时才会发生任何奇怪的事情。我假设SSL对象是沿途某处损坏,但我没有一个线索〜

编辑的SSL对象和BIO对象是如何在调用SSL_accept点空()。

在正确的方向的任何指针将不胜感激:d

回答

1

和你一样,我有困难的时候与文档的缺乏。所以我不能说set_fd电话是错误的还是正确的,但是我没有这些电话就能解决问题。我已经成功地使用调用序列是:

BIO *sbio = BIO_new_socket(socket, BIO_NOCLOSE); 
SSL* ssl = SSL_new(ctx); 
SSL_set_bio(ssl, sbio, sbio); 
SSL_accept(ssl); 
+0

优秀。问题是用BIO_s_accept()创建一个新的生物插座。我会做更多的挖掘,为什么,但是一旦我制作了一个标准的BIO插座,接受似乎就像一个魅力。 – 2010-09-03 22:45:16

2

SSL_set_fd()是指为方便替代手动设置BIOS。它会自动创建一个BIO并设置它 - 所以您只需要:

SSL* ssl = SSL_new(ctx); 
SSL_set_fd(ssl, socket); 
SSL_accept(ssl); 
+0

太棒了〜从阅读文档,我永远不会那样。谢谢! – 2010-09-04 17:34:26