- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
可以使用 recvmsg() 获取每个传入数据包的 IP_TOS 字段,还是只显示为特定套接字设置的 IP_TOS 值。如果没有,是否有人知道获取每个传入数据包的 IP_TOS 值的解决方案。我正在使用 UDP 应用程序,因此无法像 TCP 那样在应用程序层查看 IP_TOS 字段。谢谢。
添加我目前编写的代码,以防有帮助:
struct msghdr msg;
struct iovec iov[1];
memset(&msg, '\0', sizeof(msg));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = (char *) &pkt;
iov[0].iov_len = sizeof(pkt);
struct cmsghdr cmsgcmsg[1];
msg.msg_control = cmsgcmsg;
msg.msg_controllen = sizeof(struct cmsghdr);
nRet = recvmsg(udpSocket, &msg, 0);
if (nRet > 0) {
struct cmsghdr *cmsg;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg,cmsg)) {
if ((cmsg->cmsg_level == IPPROTO_IP) && (cmsg->cmsg_type == IP_TOS) &&
(cmsg->cmsg_len) ){
int tos = *(uint8_t *)CMSG_DATA(cmsg);
int isecn = ((tos & INET_ECN_MASK) == INET_ECN_CE);
printf("the tos = %i , is ecn = %d \n", tos, isecn);
}
}
最佳答案
我终于设法解决了这个问题,并在此处添加代码以供其他人使用。我希望这对其他人有帮助。这是用于 IP_TTL 的:
设置 UDPSocket 接收 IP_TTL 值:
int ttl = 60;
if(setsockopt(udpSocket, IPPROTO_IP, IP_RECVTTL, &ttl,sizeof(ttl))<0)
{
printf("cannot set recvttl\n");
}
else
{
printf("socket set to recvttl\n");
}
并通过以下方式从每个数据包中检索 IP_TTL 值(以下程序可以通过 iov[0] 检索数据消息,下面给出代码片段):
struct msghdr msg;
struct iovec iov[1];
memset(&msg, '\0', sizeof(msg));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = (char *) &pkt;
iov[0].iov_len = sizeof(pkt);
int *ttlptr=NULL;
int received_ttl = 0;
int cmsg_size = sizeof(struct cmsghdr)+sizeof(received_ttl); // NOTE: Size of header + size of data
char buf[CMSG_SPACE(sizeof(received_ttl))];
msg.msg_control = buf; // Assign buffer space for control header + header data/value
msg.msg_controllen = sizeof(buf); //just initializing it
nRet = recvmsg(udpSocket, &msg, 0);
if (nRet > 0) {
struct cmsghdr *cmsg;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg,cmsg)) {
if ((cmsg->cmsg_level == IPPROTO_IP) && (cmsg->cmsg_type == IP_TTL) &&
(cmsg->cmsg_len) ){
ttlptr = (int *) CMSG_DATA(cmsg);
received_ttl = *ttlptr;
printf("received_ttl = %i and %d \n", ttlptr, received_ttl);
break;
}
}
}
可以通过以下方式发送和获取数据消息:
发送方:
struct DATA_to_SEND pkt;
struct msghdr msg;
struct iovec iov[1];
memset(&msg, '\0', sizeof(msg));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = (char *) &pkt;
iov[0].iov_len = sizeof(pkt);
nRet = sendmsg(udpSocket, &msg,0);
接收方(假设 DATA_To_SEND 有一个名为“seq”的参数):
struct DATA_to_SEND pkt;
seqNum = ((struct DATA_to_SEND *) iov[0].iov_base)->seq;
以下是IP_TOS。设置套接字接收IP_TOS:
unsigned char set = 0x03;
if(setsockopt(udpSocket, IPPROTO_IP, IP_RECVTOS, &set,sizeof(set))<0)
{
printf("cannot set recvtos\n");
}
else
{
printf("socket set to recvtos\n");
并通过以下方式从每个数据包 header 中检索 IP_TOS 值:
struct PC_Pkt pkt;
int *ecnptr;
unsigned char received_ecn;
struct msghdr msg;
struct iovec iov[1];
memset(&msg, '\0', sizeof(msg));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = (char *) &pkt;
iov[0].iov_len = sizeof(pkt);
int cmsg_size = sizeof(struct cmsghdr)+sizeof(received_ecn);
char buf[CMSG_SPACE(sizeof(received_ecn))];
msg.msg_control = buf;
msg.msg_controllen = sizeof(buf);
nRet = recvmsg(udpSocket, &msg, 0);
if (nRet > 0) {
struct cmsghdr *cmsg;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
cmsg = CMSG_NXTHDR(&msg,cmsg)) {
if ((cmsg->cmsg_level == IPPROTO_IP) &&
(cmsg->cmsg_type == IP_TOS) && (cmsg->cmsg_len) ){
ecnptr = (int *) CMSG_DATA(cmsg);
received_ecn = *ecnptr;
int isecn = ((received_ecn & INET_ECN_MASK) == INET_ECN_CE);
printf("received_ecn = %i and %d, is ECN CE marked = %d \n", ecnptr, received_ecn, isecn);
break;
}
}
}
关于c - Linux : Can Recvmsg be used to receive the IP_TOS of every incoming packet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881200/
Packet packet = new Packet(); while(packet != null ) { packet = jpcap.get
我有一个 python 脚本,它使用 dpkt 捕获以太网上的数据包,但我如何区分哪些数据包是 tcp,哪些是 udp。 最终,我希望获得在时间间隔内建立的每个 tcp 连接的数据包列表。 我的代码是
当我尝试将电缆与网络摄像头连接时,系统提示电缆无法连接到该端口。有人能帮我拿一下这个吗?
我正在尝试为 IPv6 建立 TCP 握手。 SYN 数据包被发送。接口(interface)收到SYN/ACK。 我对收到的数据包进行了十六进制转储,还对 pkt.show() 进行了处理。我得到以
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我在我的 Android 应用程序中使用 aSmack 与我的 XMPP 服务器通信,我打开了 Smack 的调试,这样我就可以看到所有 XML 的来来去去。我的问题是我正在使用 PacketList
自从升级到 Xcode 4.2 以来,我经常遇到错误,尝试调试应用程序失败,并显示消息“未知数据包回复:环境数据包“超时”。”重新启动设备并不能始终解决问题(尽管有时可以解决),重新启动 Xcode
我得到了一个派生自 sf::Packet 的类,它在其构造函数中传递了一个引用 iots 类型的 Integer。现在在构造函数中,我尝试将 Integer 添加到 sf::Packet 的数据中,如
我正在使用 Debian 操作系统。我正在编写网络仿真程序,我想获取所有数据包并停止 Debian从响应任何发送的数据包。 到目前为止,我已经打开了一个套接字,并且收到了所有数据包,但 Debian
对于一个应用程序,我需要能够创建一个多用户聊天室并加入其中。聊天服务器是一个 openfire 服务器。 我曾经有过: MultiUserChat chat = new MultiUserChat(c
我正在研究 中的核心音频转换服务 Learning Core Audio 我对他们 sample code 中的这个例子感到震惊: while(1) { // wrap the destina
我在my.cnf中添加了如下内容 [mysqld] max_allowed_packet=32M [mysql] max_allowed_packet=32M 而且我还在 JDBC 查询中添加了以下内
我需要测试 FTP 应用程序的数据包丢失情况。我用了Wireshark数据包嗅探器,我得到了 TCP 流。 如何使用 Wireshark 查找丢包情况? 最佳答案 数据包丢失和其他相关指标(例如误码率
每个人。这就是我们的门记录系统 Falco。当员工在读卡器上刷他/她的 ID 时,信号会传送到 Falco 服务器并将数据(卡 ID、时间)输入数据库。 Falco 的报告真的没有帮助,所以我们的人力
我正在研究 iSCSI 协议(protocol),现在我处于使用 Wireshark 捕获要查看的数据包的阶段,哪些数据包用于维护事件 session ,以及当我将文件复制到我的逻辑卷时,哪些数据包被
我无法理解网络上的任何人如何使用数据包嗅探器。 我对网络的工作原理知之甚少,但让我这样说吧:假设 postman 过来把包裹送到我家门口。为什么我可以翻遍他的所有其他包裹并环顾四周? postman
我已经看到(通过实际读取 tun 设备)Linux 上的 tun 驱动程序可以在一次读取中返回多个 IP 数据包。反之亦然 - 您可以在一次写入 tun 设备中写入多个 IP 数据包吗? 最佳答案 实
这个问题确实集中在我的问题上,与我在该主题上找到的任何其他问题无关。 PSA:当我说“数据包”时,我的意思是在单个 socket.recv(maxsize) 中接收到的完整字符串 我在 Java(我的
我想提高数据包传输性能。在此之前我使用原始套接字,现在我研究 packet_mmap。我有数据包(帧),我已经从另一台 PC 的内核模块中捕获了这些数据包(帧),并将其放入当前 PC,现在我想通过以下
我正在尝试使用带有一些标志的 tshark,并为每个过滤的跟踪获取时间戳。我正在使用它来过滤系统中的所有 DNS 查询。我无法获得时间戳以及过滤器工作。例如,如果我尝试类似 tshark -t ad
我是一名优秀的程序员,十分优秀!