简体   繁体   English

从 Linux 中 TCP 套接字上接收到的数据包中获取 TOS 字段?

[英]TOS Field fetch from received packet on TCP socket in linux?

I have a C++ network application running on linux using TCP sockets.我有一个使用 TCP 套接字在 linux 上运行的 C++ 网络应用程序。 I have been trying to fetch the DSCP marking from a received packet for TCP.我一直在尝试从接收到的 TCP 数据包中获取 DSCP 标记。 We have IP_RECVTOS socket option for UDP.我们有用于 UDP 的 IP_RECVTOS 套接字选项。 But I have tested in code that it is not working for TCP.但是我在代码中测试过它不适用于 TCP。

What options do I have except raw sockets to address the issue ?除了原始套接字之外,我还有哪些选项可以解决这个问题?

   Example code : The following is for UDP. I am looking for something similar for TCP. 

   //Set the socket option to receive 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");
}

// and Retrieve the IP_TOS value from every packet header by:

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;
   }
    }
  }

This link said the IP_RECVTOS can only be used to fetch peer UDP TOS, but not for TCP.这个链接说IP_RECVTOS只能用于获取对等UDP TOS,而不能用于TCP。 but it is 10 years before.但它是10年前。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM