问题标签 [recvmsg]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
498 浏览

c - 确认消息已使用 socketCAN 发送到 CAN 总线

我想确认我的消息已通过 socketCAN 库保存在 CAN 总线上。socketCAN 文档描述了使用 recvmsg() 函数时的这种可能性,我在实现时遇到了问题。

我要实现的功能是确认我的消息赢得了仲裁过程。

0 投票
0 回答
56 浏览

c - 在 Netlink 中的 sendmsg 和 recvmsg 之间使用相同的 struct msghdr 对象

我有一些代码片段,我通过 API 发送然后接收消息。

所以问题是,我应该重新初始化msg成员吗?还是从API的角度保证sendmsg()不会破坏这些领域?不幸的是,我没有找到任何确认或否认。
很抱歉,如果很明显。

0 投票
0 回答
51 浏览

c - 使用 WSARecvMsg 时查找多播 UDP 数据包的发送者

我正在尝试检索多播数据包的发送者的 ip 以及多播数据包发送到的目标地址/接口。

当接收多播数据包recvfrom(SOCKET s, char *buf, int len, int flags, sockaddr *from, int *fromlen)时,通过 from 参数返回发送者 IP,但是没有提供有关数据包发送到的地址的信息。

为了克服这个缺点,recvfrom()我尝试使用WSARecvMsg()它应该提供所有所需的信息。其他问题的答案似乎都非常有信心,可以使用(至少 *nix)recvmsg 方法获取所需的所有信息。

当接收到带有结构的数据包WSARecvMsg()并检查其IN_PKTINFO结构时,它包含以下内容:

文档中,成员ipi_addr是目标地址,并且ipi_ifindex是接收它的接口。

从上面看来,似乎WSARecvMsg()只能提供另一半(即目的地)而不能提供发件人信息。

我错过了什么吗?还是有另一种方法来获取我想要的信息,最好不必求助于原始套接字?

0 投票
0 回答
165 浏览

c - 如何判断 UDP 数据包何时来自本地机器?

我使用 recvmsg(2) 收到一个 UDP 数据包。我想知道它是否来自本地机器。

我可以将 IP_PKTINFO 与 recvmsg 一起使用来获取接收数据包的接口。当数据包被发送到环回地址时,这就是环回接口,这很棒。当数据包被发送到某个其他网络接口的地址时,无论数据包是否是本地生成的,它都会作为该接口返回,这不是很好。

我可以检查数据包的源地址是否是本地机器的地址,但如果禁用反向路径过滤,那么它可能具有该地址并且仍然来自另一台机器,我不能假设它不是。此外,这将是我收到数据包和检查本地地址之间的竞争。

系统是Linux。C 或 C++。执行此操作的进程具有 CAP_NET_ADMIN。如何确定收到的数据包是否来自本地机器?

0 投票
0 回答
65 浏览

c++ - 是否可以诱导 recvmsg 返回错误?

我正在编写一个调用 的库,recvmsg现在我正在为该库编写测试。我想测试错误路径:recvmsg返回错误时运行的代码。我可以模拟出来,recvmsg但如果可能的话,我更愿意尽可能多地测试真实代码。

有没有办法诱导recvmsg返回错误?对于我当前的用例,我不在乎哪个错误,因为我处理所有错误都是一样的,但是能够引发特定错误将是一个不错的选择。

万一这很重要,我从中接收的套接字是 UDP 套接字。

0 投票
1 回答
101 浏览

php - 我可以通过 socket_sendmsg (sendmsg) 将 TCP 套接字资源传递给 AF_UNIX 本地套接字吗?如果可以,如何

我的目标是将套接字连接(一旦“握手”(http 升级)和“身份验证”(我自己的函数使用提供的详细信息对我的数​​据库进行挑战))传递给另一个 php 脚本进程(未分叉),以便它可以将其添加到自己的套接字资源“经过身份验证的客户端”数组中并接管连接。一旦它通过 sendmsg 的 php 包装器发送(socket_sendmsg - 谁的 PHP 文档不准确,所以我一直在看人们试图在 c 中做同样的事情)

如果我发送:

如果我这样做(在该resourceArray上的socket_select之后),它正在发送打开的日志文件的文件描述符:

然后我在日志中看到“来自第二个脚本”的消息(所以我能够写入传递的文件描述符 - 即使在传递者关闭之后(每个进程都有一个计数附加到文件描述或某些东西会增加))。如果我从传递者而不是日志文件描述符发送它,这也适用于 STDOUT。

当我更改为发送一个经过身份验证的 tcp 套接字客户端资源时,如果我转储它会显示一个资源 ID:

)

问题是当我尝试使用传递的套接字资源“Resource id #12”时,我得到

在其读取资源数组中添加了“Resource id #12”的 socket_select 也抱怨它无效。

我在这里尝试以某种不同的方式传递套接字吗?我错过了什么(除了显而易见的事情)。

0 投票
1 回答
627 浏览

c - sendmsg 和 recvmsg 中的 iov 和 msg_control

iov.iov_base 和 msg.msg_control 有什么区别?我正在查看一些代码示例(ipuitls 开源 ping) 当使用 sendmsg 发送数据时,数据包设置在 iov.iov_base 当使用 recvmsg 读取数据时,数据包是直接从 msg->msg_control 读取的。

struct iovec 和 struct msghdr 之间有什么关系?读取/发送数据时有区别吗?

对不起这个愚蠢的问题。到目前为止我还没有找到答案,我很困惑。谢谢 !

0 投票
1 回答
150 浏览

c - 在 C Linux 套接字中使用 iovec 传递多个缓冲区

我正在编写一个 linux C 客户端-服务器程序,它通过 unix 域套接字相互通信,并且每次都通过几个缓冲区。我正在使用 ioverctors,但由于某些原因,服务器程序只接收第一个 io 向量。任何的想法 ?我附上了相关的代码片段。

客户端代码:

我从服务器得到的输出:recv:abc 16 16