问题标签 [recvmmsg]

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

c - 无需轮询即可读取多个 UDP 消息

我想使用该recvmmsg调用一次从一个单个套接字读取多个 UDP 消息。我正在从单个多播组中读取数据。

当我读取 TCP 数据时,我通常使用poll/select 非阻塞套接字(和超时),以便在准备好读取时得到通知。我遵循这种方法,因为我知道虚假唤醒问题和阻塞套接字的潜在问题。

由于我的应用程序必须非常快,如果我采用相同的方法,recvmmsg我将引入一个额外的系统调用 ( poll/select),这可能会减慢执行速度。

所以我的两个问题如下:

  1. recvmmsg使用 UDP,我可以使用without安全地从 BLOCKING 套接字读取,poll/select还是必须应用与 TCP 相同的原理(非阻塞 + 轮询)?
  2. 假设我有大量的多播流量,你会只选择非阻塞套接字+ recvmmsg(无轮询)并消耗大量 CPU 吗?

我正在使用 Linux:CentOS 7 和 Oracle Linux。

0 投票
0 回答
80 浏览

c - recvmmsg 在 CTRL-C 上仍然被阻止

我正在使用recvmmsg从多播组中读取阻塞的 UDP 套接字。

在该 API 的手册页中,我注意到错误消息没有提到 EINTR,因此看起来 api 在收到信号时无法捕获。

我进行了测试,我可以看到,如果我在阻塞等待某些数据读取时发出 CTRL-C,recvmmsg则不会发生任何事情并且它仍然被阻塞。

您知道为什么会发生这种情况以及如何正确捕捉信号吗?

我正在使用 Linux CentOs 7 和 Oracle Linux

0 投票
1 回答
341 浏览

ssh - 使用不同节点执行时 MPI_Send 卡住

我有一个非常简单的 MPI 程序,其中节点 0 向节点 1 发送一个字符,但是每当我使用两台或更多不同的机器时,发送和接收都会卡住。当我仅在一台机器上使用多个进程时,该程序运行良好。好像是沟通的问题,但是我不知道是什么问题......

这是代码:

另外,这里有一些重要的注意事项:

  1. 我在 Google Compute Engine 中使用 2 个虚拟机集群:mpi-test-uaiwmpi-test-130b
  2. 我已经在两个虚拟机之间配置了无密码ssh,也就是说,从mpi-test-uaiw我可以输入ssh mpi-test-130b并且它工作正常(反之亦然);
  3. 使用 MPI 的简单“Hello World”适用于该集群,但它不包含任何发送或接收操作;
  4. 防火墙已停用。

任何帮助,将不胜感激。谢谢!

0 投票
0 回答
231 浏览

c - recvmmsg/recv/recvfrom 块在高负载下

我们在 Centos 6 上有一个应用程序,它调用recvmmsg()多播地址一次读取 1024 个 UDP 数据包。当我们在同一个盒子上运行这个应用程序的多个实例(都监听相同的流量)时,有时这个调用会阻塞几秒钟,尽管套接字是非阻塞的,并且传入了MSG_DONTWAIT. 它在所有其他情况下都可以正常工作,但会在高负载 (50MB/s) 下冻结。当应用程序阻塞时,我们落后于 UDP 流量并且无法恢复。该进程使用 RR 调度程序作为高优先级运行,以避免来自其他进程的干扰。我们也尝试切换到for 循环recvfrom()recv()获得相同的结果。

我们可以在内核源代码中看到的唯一可以阻止它的是spin_lock_irqsave()__skb_try_recv_datagram(). 但我不知道在什么情况下会出现问题,或者如何处理它以防止阻塞,或者这是否真的是问题。

我不确定下一步该往哪里看,所以任何指针都将不胜感激。

创建了一个非常简单的程序,可以在我们看到它的一个服务器上复制它(没有粘贴接口检索功能,但这不应该在这里相关,如果你需要它,请告诉我)。

recv() 示例:

recvmmsg() 示例:

0 投票
3 回答
1455 浏览

c++ - 如何获取 recvmsg 的 msg_control 缓冲区的大小?

使用 recvmsg 时,我使用MSG_TRUNC并且MSG_PEEK喜欢这样:

这给了我为下一条消息分配的缓冲区大小

我的问题是如何获得我应该为msg_control标题内的字段分配的缓冲区大小

0 投票
0 回答
136 浏览

c - 进程在接收完整的映射内存块时挂起套接字 recvmsg 调用

我有一个服务器进程(C 程序),它对大小约为 70MB 的物理内存进行 mmap,当我通过套接字将整个内存块发送到客户端进程时,我的套接字发送 api 返回成功,但客户端一直在等待消息受到。只有当我发送完整的映射块时才会出现问题。如果我发送的少于那个,那么这个问题永远不会出现

0 投票
1 回答
52 浏览

c - Linux C 套接字 - recvmsg - 获取源 ifindex

我在 Linux 中打开一个 RAW 套接字并读取所有消息。

我正在遍历那个 msg 缓冲区上的所有 cmsg,但我只得到一个。

如何提取它收到的 ifindex ?