如何在Unix域套接字上用多个“读取”调用替换“ recvmmsg”调用?

时间:2019-05-28 22:35:38

标签: c++ linux sockets unix python-3.6

我正在将C ++单元测试转换为python功能测试,事实证明这很困难。

该测试是从unix域套接字读取的。它首先写入一个简单的消息(字符串),然后从套接字读取。

单元测试/编译的C ++程序调用'recvmmsg'以从套接字读取。它使用“ c消息”范例。我的功能测试试图做同样的事情,但是从一个轨迹开始,我意识到我的功能测试/ python最终只是简单地调用了“ read”。

我认为部分困难在于单元测试/ unix域套接字正在使用此c消息范例。

这是单元测试/ recvmmsg的记录:

recvmmsg(3, {{
{msg_name(0)=NULL, msg_iov(1)=[{"\360", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [5]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\252", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [6]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\255", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [7]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\210", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [8]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\377", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [9]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\177", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [10]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [11]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [12]}], msg_flags=0}, 1}}, 8, 0, NULL) = 8 (left NULL)

要读取的实际数据是一些文件描述符/整数。检查下面的单行,[5]是文件描述符,其余为元数据。

{msg_name(0)=NULL, msg_iov(1)=[{"\360", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [5]}], msg_flags=0}, 1}

然而,在我的python程序中,似乎只读取了msg_iov,不确定原因:

read(5, "\360", 8192)                   = 1
read(5, "\252", 8192)                   = 1
read(5, "\255", 8192)                   = 1
read(5, "\210", 8192)                   = 1
read(5, "\377", 8192)                   = 1
read(5, "\177", 8192)                   = 1
read(5, "\0", 8192)                     = 1
read(5, "\0", 8192)                     = 1

还有很多事情要做,例如使用socat将unix域套接字转换为TCP套接字。我忽略了包含代码示例,因为它们所提供的功能远远超过strace输出。

如果可以将recvmmsg调用替换为几个“ read”,则非常简单。从逻辑上讲,我会假设如果我阅读的内容不足,那么我的下一次阅读将在上次中断的地方继续进行。似乎没有,只是每次读取msg_iov。在python中调整缓冲区大小似乎没有任何改变。

我在尝试不可能的事吗?

0 个答案:

没有答案