- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 Linux 套接字选项 SO_RXQ_OVFL 来检测 UDP 溢出。此选项使用辅助消息来报告丢弃的数据包数。来自男人:
SO_RXQ_OVFL (since Linux 2.6.33)
Indicates that an unsigned 32-bit value ancillary message (cmsg) should be
attached to received skbs indicating the number of packets dropped by the
socket between the last received packet and this received packet.
我的代码没有找到辅助消息。这是我所做的:
在启动时,我创建套接字并指定 SO_RXQ_OVFL 套接字选项:
int dropmonitor_on = 1;
if ( setsockopt(udpSocket, SOL_SOCKET, SO_RXQ_OVFL, &dropmonitor_on, sizeof(dropmonitor_on) ) != 0 )
{
perror("setsockopt SO_RXQ_OVFL not supported by your Linux Kernel");
}
然后我有一个调用 recvmsg 并查找辅助消息的接收函数:
struct sockaddr_in src_addr; // The source address will be assigned to here
struct iovec iov[1];
iov[0].iov_base=ap_rxBuffer;
iov[0].iov_len=a_maxSizeBytes-1;
int cmsg_len = CMSG_SPACE(sizeof(uint32_t));
char cmsg[CMSG_SPACE(sizeof(uint32_t))];
memset(cmsg,0,cmsg_len);
struct msghdr message;
memset(&message,0,sizeof(struct msghdr));
message.msg_name=&src_addr;
message.msg_namelen=sizeof(struct sockaddr_in);
message.msg_iov=iov;
message.msg_iovlen=1;
message.msg_control=cmsg;
message.msg_controllen=cmsg_len;
int receivedBytes = 0;
if ( (receivedBytes = recvmsg( a_socket, &message, 0 )) == SOCKET_ERROR )
{
closeSocket(a_socket);
fatal("recvmsg() failed");
}
else
{
// Reception successful so interrogate ancillary message to get number of dropped packets
int udp_packets_dropped = 0;
struct cmsghdr* p_cmsg;
p_cmsg = CMSG_FIRSTHDR(&message);
for (p_cmsg = CMSG_FIRSTHDR(&message); p_cmsg != NULL; p_cmsg = CMSG_NXTHDR(&message, p_cmsg))
{
if ((p_cmsg->cmsg_level == SOL_SOCKET) && (p_cmsg->cmsg_type == SO_RXQ_OVFL))
{
int* p_udp_packets_dropped = (int *) CMSG_DATA(p_cmsg);
udp_packets_dropped = *p_udp_packets_dropped;
cout << "UDP pkts dropped: " << udp_packets_dropped << endl;
break;
}
}
if (p_cmsg == NULL)
{
fatal("Error: p_cmsg == NULL");
}
}
当我运行代码时,它因这个 fatal error 而停止:
Error: p_cmsg == NULL
由上面的代码生成,表示没有找到辅助消息。奇怪的是,有时我确实会收到一条辅助消息,所以也许我留下了一些未初始化的东西。
我仔细检查了代码,没有发现任何错误。请提供一些帮助,我将不胜感激。
最佳答案
我也有这个问题。
经过一番挖掘,我在内核源代码中发现了一些提示: https://github.com/torvalds/linux/blob/master/net/socket.c
static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
struct sk_buff *skb)
{
if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && SOCK_SKB_CB(skb)->dropcount)
put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
sizeof(__u32), &SOCK_SKB_CB(skb)->dropcount);
}
查看“if (... && SOCK_SKB_CB(skb)->dropcount)”,我认为如果dropcount为0,cmsg应该为空。您的代码应该是正确的。
关于c - 如何正确使用 SO_RXQ_OVFL 检测 Linux 套接字上的 UDP 溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40870873/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!