这个 SSL_do_handshake() 可能是个巨坑。楼上不一定有处理清楚:
1. 一般说接收连接,都是一个协程专门 accept(),成功之后 spawn 一个新协程处理这个连接。这里要特别注意 handshake() 的调用时机,必须在子协程里面,而不能是 accept() 的这个协程。不然会卡 accept() 协程。造成不能继续处理连接。
2. 要把 SSL 变成异步的,这个可不简单。需要反复处理 SSL_ERROR_WANT_READ 和 SSL_ERROR_WANT_WRITE 不容易写好。
3. 碰到 SSL_ERROR_SYSCALL 和 SSL_ERROR_SSL 要调用 ERR_get_error() 清理掉错误码,不然整个线程里面所有协程的 SSL 连接都会出错。所以处理 SSL 的协程也不要在线程之间调度来调度去的。
用好协程不是件容易的事。
【 在 wallyz 的大作中提到: 】
: 如果说"密钥协商,和登录认证"造成了“IO长时间占用线程”的话,那应该说明的是,之前“接续模式”的程序本身的IO方式有些问题
: 因为SSL_do_handshake本身支持以非阻塞方式进行,主要是适当的处理SL_ERROR_WANT_READ和SSL_ERROR_WANT_WRITE;
: 登录认证就更不用说了,肯定只是一些应用层的消息交互,如果设计没问题,这必然不可能造成IO长时间占用线程
: ...................
--
FROM 120.33.8.*