我有一个TCP客户端,并且使用非阻塞套接字通过OpenSSL进行服务器通信。所有套接字读取和写入总是从单个线程执行。在客户端运行之前,连接一直保持打开状态,并且通信不遵循请求-答复模型。
客户端不断向服务器发送消息,服务器将消息记录到数据库中。客户端有时可以发送数据请求,并会从套接字读取数据:
SSL_write...
SSL_write
SSL_write
... 编写请求以从数据库获取数据 (正在等待SSL_read中的数据...)
SSL_read
...接收到的数据,恢复写入
SSL_write
SSL_write
SSL_write
服务器循环读取直到数据可用 收到来自DB的数据请求后,第二个线程准备数据,而主线程中的读取循环继续。由于客户端正在等待数据,因此服务器上的SSL_read将失败,并显示SSL_ERROR_WANT_READ。
处理错误SSL_ERROR_WANT_READ: 服务器尝试套接字是否可读,如果套接字不可读,则读取完成,如果缓冲区中可用,则将数据发送到客户端,主循环转到“选择”以侦听传入的消息。
客户端成功接收数据并尝试再次写入服务器。但是从这一点来看,服务器不会在套接字上注册它们,并且数据也不会写入数据库。
1 /当客户端发送SSL_write偶尔被SSL_read中断时,此模型是否适用于OpenSSL?
2 /在SSL_read循环的中间,服务器将响应发送回客户端(SSL_write)是否合适?
3 /什么是正确的方法?
感谢任何想法。
基本上,这是在服务器成功将数据发送回客户端之后,服务器中的Select并不表示任何文件描述符就绪。请注意,客户端从服务器接收数据后会发送更多数据。数据是从客户端发送的,没有错误,但是服务器Select没有响应。
我注意到我的Ubuntu 18.04将OpenSSL从1.1.0g更新到1.1.1,并且提到的问题仅在此升级之后开始。