我正在使用BIO存储器接口使TLS通过SCTP实现。如何使用内存BIO接口处理通过SCTP流传输的TLS的EAGAIN案例
所以在客户端侧,在发送出应用数据,
SSL_write()
API加密数据和所述相关联的写入BIO接口写入数据。- 然后从BIO接口的数据读入到使用
BIO_read()
呼叫,然后 - 发送到使用
sctp_sendmsg()
API套接字一个输出缓冲区。 在服务器侧
类似地,虽然从插座读取数据
sctp_recvmsg()
API读取来自插座ecrypted消息块,BIO_write()
API将其写入到读取BIO缓冲器,和SSL_read()
api解密从BIO读取的数据。
我感兴趣的情况是在客户端,步骤1和2完成,并在做3时,我从套接字获得EAGAIN。因此,无论我从BIO缓冲区读取的数据是什么,我都会清理它,并要求应用程序在一段时间后重新发送数据。
现在,当我这样做,后来当客户端的步骤1,2和3经过罚款,在服务器端,openssl发现它收到的记录已得到一个bad_record_mac并关闭连接。
从谷歌搜索我知道它的一个可能性是如果TLS数据包出现序列,因为MAC编码依赖于先前编码的数据包,并且,TLS需要以相同的顺序传递数据包。所以,当我清理EAGAIN上的数据时,我正在丢弃一个SSL数据包,然后发送一个乱序的数据包(这里缺少清晰度)?
只是为了确认我的假设,无论何时套接字返回EAGAIN,我将代码更改为无限等待,直到套接字可写,然后一切正常,我没有在服务器端看到任何bad_record_mac。
有人可以帮我在这里处理这个EAGAIN吗?我无法做出无限的等待来解决这个问题,还有没有其他办法?
非常好,我搞不清楚他在说什么。 – EJP