问题标签 [sendmsg]

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 投票
1 回答
184 浏览

linux - 如何为 sendmsg() 获取 ipi_ifindex 的值?

sendmsg()如果为 设置了值,则可以使用它指定从哪个接口发送数据报in_pktinfo.ipi_ifindex

如果数据包是对收到的数据报的响应,recvmsg()我可以从那里获取接口值。

如果我只知道 'eth0' 或 'eno1' 的接口,我如何查找相应的 `in_pktinfo.ipi_ifindex' 值?

0 投票
0 回答
163 浏览

sockets - 从 Unix 套接字发送文件描述符

我正在使用 Linux sendmsg() 函数通过 Unix 套接字将文件描述符以及一些数据有效负载发送到另一个进程。我多次调用 sendmsg。在目标进程内的 recvmsg() 伴随调用中,我使用类似“fdptr = (int *) CMSG_DATA(cmsg); memcpy(fdptr, myfds, NUM_FD * sizeof(int));”的内容获取文件描述符 我注意到,每次查看文件描述符时,文件描述符的编号都与之前的 recvmsg() 调用不同。

我的问题:目标进程是否对同一个文件/硬件保持打开一堆打开的描述符?我需要关闭描述符吗?

如果我不尝试使用“memcpy(fdptr, myfds, NUM_FD * sizeof(int));”复制描述符会发生什么 本质上是“把它留在里面”CMSG_DATA(cmsg)?会不会有一些带有未知数字的描述符坐在那里?如果我没有把它复制出来,我永远不会看到它本质上是另一个描述符编号。

0 投票
0 回答
56 浏览

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

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

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

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 回答
145 浏览

c - c sockets sendmsg MSG_DONTWAIT - 缓冲区重用

我正在使用 C 套接字发送设置了 MSG_DONTWAIT 标志的 ICMP 数据包。我的程序是单线程的,但它希望以高频率发送消息,所以我将消息发送设置为非阻塞。每次调用后共享/修改/重用消息缓冲区是否安全?(除非返回 EAGAIN 或 EWOULDBLOCK)。

msg_control(辅助数据)被重用,并且在调用之间修改 msg_control->struct in_pktinfo->ipi_ifindex(出站接口 ifindex)。

iov.iov_base 缓冲区内容(不是指针!)和 iov.iov_len 也可以在调用之间更改。(不太可能但仍然可能)。

可以在非阻塞模式下高频更改 calsl 之间的 ifinex 和 iov_base 内容吗?(除非我回来 EAGAIN 或 EWOULDBLOCK)

谢谢 !

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 投票
2 回答
102 浏览

c - sendmsg() / connect() 因原始 IPv6 套接字上的权限错误/EACCES 而失败

我尝试让一个程序在 OpenWRT(内核版本:4.14.215,musl libc 版本:1.1.24)上运行,它实现了RFC8157(一种新的隧道协议)。不幸的是,写它的人似乎不再维护它了。

在某些时候,它会通过 .将其第一条消息写入原始 ipv6 套接字sendmsg()。不幸的是 sendmsg() 返回 EACCES。我对系统编程很陌生,并不知道要寻找什么。

我尝试了以下方法:

所以套接字似乎以读/写模式打开。

lsof 也列出了套接字。但由于某种原因,ipv6 地址为 0。

手册页列出了尝试将 UDP 数据包从广播地址发送到任播地址的可能原因。但这似乎不是这里的情况。原始 IPv6 套接字不是 UDP 套接字(不是吗?),并且 src IP 是公共的。

一切都以root用户身份执行。

由于我不确定要查找什么,因此这是整个功能:

sendmsg()在最后一个 if 语句中使用。

0 投票
0 回答
122 浏览

winapi - 通过 NirCmd 将“Enter”键发送到未激活的窗口

亲爱的编码爱好者,

在去年,我了解了非凡的命令行工具 NirCmd。有了它,我在一个快捷方式上实现了许多功能,例如使麦克风静音、将音量设置为预定义的水平等等。因此,当我需要通过团队交谈时,我可以使用任何键盘控制所有声音选项,并关闭笔记本电脑。我还没有意识到接听和接听 MS Teams 的电话。NirCmd 可以选择可靠地识别窗口。

出于测试目的,我打开了一个名为 test.docx 的 word 文件。当它在后台时,这个通过桌面快捷方式调用的 NirCmd 会正确激活它:nircmd.exe win activate ititle "test" 所以 ititle 工作。

不,再次测试基本原理,我想将击键发送到 test.docx 窗口,而不激活它。它应保留在后台。

我在搜索 stackoverflow 和其他网站时发现的“[...] 因为 Sendmsg 将与 win api 对话,IIRC 发送您需要 0x102 的击键,并且 wparam dec ascii val 小写 e 为 101。所以尝试 nircmd win sendmsg ititle "gamename " 0x102 101 1 – user6811411" "# send a Return to that window (0x102 is WM_CHAR and 0x0D is VK_ENTER)"

所以我怀疑我的 NirCmd 调用必须如下所示:nircmd.exe win sendmsg ititle "test" 0x102 0x0D 0

但不幸的是,什么也没发生。我整个上午都在研究它,无休止地搜索网络,但我没有通过它。有没有人可以阐明如何将“输入”击键发送到通过“ititle”确定的背景中的单词窗口

提前谢谢了!最好的问候, 安德烈亚斯

0 投票
1 回答
150 浏览

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

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

客户端代码:

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