【发布时间】:2020-05-02 13:36:01
【问题描述】:
send(2) 需要一个缓冲区和一个缓冲区长度。它可以返回错误,或者成功发送到缓冲区长度大小的某些字节数。在某些情况下,send 发送的字节数会少于请求的字节数(例如https://stackoverflow.com/a/2618755/939259)。
除了发送大消息并从另一个线程触发信号并希望幸运之外,有没有办法在单元测试中持续触发短发送?
【问题讨论】:
-
您是否尝试过模拟
send并返回特定的测试值? -
用信号中断
send()可能不会这样做。您可能需要通过停止读取过程来填充内核的套接字缓冲区,然后尝试发送超出缓冲区剩余部分容量的内容。 -
@dbush 我在性能敏感代码中使用 gmock,所以这意味着添加一个类并将我的代码模板化,该代码使用 send 仅用于测试一个非常具体的案例。如果必须,我会这样做,但我希望有其他选择。
-
我真的没有看到更好的选择。除了模拟之外,您可以自己发送信号(这似乎很难确定)或编写自定义内核模块。
-
如果您可以在发送端操作套接字,您可以尝试将套接字的发送缓冲区大小减小到小于您要传递给
send的数据长度的值.我从来没有摆弄过它,因此我不确定它是否以及如何精确工作,但在 linux 下,有一个套接字选项SO_SNDBUF(记录在socket(7)中,您可以使用setsockopt(2)设置发送缓冲区大小。但是,我自己从来没有这样做过,因此我不知道这是否像我预期的那样有效,以及它是否有助于解决您的问题。
标签: c sockets networking posix