usrsctp 发送缓冲区不会自行释放

Posted

技术标签:

【中文标题】usrsctp 发送缓冲区不会自行释放【英文标题】:usrsctp send buffer does not free itself 【发布时间】:2017-09-25 10:59:00 【问题描述】:

我们正在使用C++ webrtc data channels library 和test application,在发送一些总大小约为256kB 的小数据包时,usrsctp_sendv() 调用返回-1(errno 为EWOULDBLOCK/EAGAIN,这意味着“资源暂时不可用”)。我们认为这是因为我们达到了 usrsctp 的发送缓冲区限制,默认为 256 kB。我们尝试在每次发送调用之间添加几个睡眠延迟,希望它清除该缓冲区,但没有任何效果。

接收方(一个 JS 网页)确实会接收到我们发送的所有字节,直到它出错。还值得注意的是,这只发生在我们尝试将数据从 C++ 应用程序发送到 JS 时,而不是相反。我们尝试查看 mozilla 的 datachannels 实现,但似乎无法就问题可能得出任何结论。

【问题讨论】:

【参考方案1】:

很难马上回答这样的问题。我将开始查看wireshark跟踪,以查看您的远程端(JS页面)是否确实确认了您发送的数据(即,如果SACK块被发回)以及这些SACK中报告的接收缓冲区(a_rwnd)的值是多少。这可能不是您的问题,但是您收到 EWOULDBLOCKS 只是因为发送方 SCTP 无法从缓冲区刷新数据,因为它仍在等待来自远程端的传递确认。 请提供有关您的案例的更多详细信息,如果可能的话,请提供您的 JS 页面的示例代码。

【讨论】:

是的!这就是我要去的地方。我正在尝试首先删除 webRTC 库中的 DTLS 层,以便我可以分析数据包。这是JS page

以上是关于usrsctp 发送缓冲区不会自行释放的主要内容,如果未能解决你的问题,请参考以下文章

在重叠模式下使用 WSASend 时,我应该何时释放缓冲区?

使用winsock发送缓冲区后可以删除内存吗?

我如何限制发送到Stomp队列(处理websocket)的数据量,以便可以保证不会溢出缓冲区?

kafka生产者投递消息特征(异步发送)

通过命名管道发送数据包?单字节缓冲区还是预先确定大小的?

将大字节流缓冲区发送到另一个进程