2012-07-11 203 views
2

IP标头具有服务类型(TOS)字段。它可用于设置有类排队规则,即PRIO。如何使用TOS设置消息优先级?

我测试了以下代码。

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char**argv) 
{ 
    int listenfd, connfd, optval; 
    struct sockaddr_in servaddr, cliaddr; 
    socklen_t clilen; 
    pid_t  childpid; 
    char  mesg[16]; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0); 

    bzero(&servaddr, sizeof(servaddr)); 
    bzero(mesg, 0, sizeof(mesg)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY); 
    servaddr.sin_port = htons(32000); 
    bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr)); 

    listen(listenfd, 1024); 

    for (;;) 
    { 
     clilen = sizeof(cliaddr); 
     connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); 

     if ((childpid = fork()) == 0) 
     { 
     close(listenfd); 

     for (;;) 
     { 
      optval = 0x28; 
      setsockopt(cliaddr, IPPROTO_IP, IP_TOS, &optval, sizeof(optval)); 
      strcpy(mesg, "tos=0x28"); 
      sendto(connfd, mesg, sizeof(mesg), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); 
      sleep(2); 

      optval = 0x58; 
      strcpy(mesg, "tos=0x58"); 
      setsockopt(cliaddr, IPPROTO_IP, IP_TOS, &optval, sizeof(optval)); 
      sendto(connfd, mesg, sizeof(mesg), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); 
      sleep(2); 
     } 

     } 

     close(connfd); 
    } 
} 

可以在TOS字段设置成功的情况下发送数据包。但是我应该怎么做才能使消息优先生效?谢谢!

+0

你应该用tc设置你的机器,以确保0x28在出口队列上获得更高的优先级。 – marcorossi 2015-06-20 00:31:13

回答

1

TOS是对路由器的指令。除非路径中的所有路由器都认同它的含义,否则它不起作用,请将它完好地传递给下一个路由器,并且自己做一些事情。他们呢?如果路径中没有路由器,则根本不起作用。

+0

谢谢你,EJP。但Linux有流量控制(tc)工具来排队和过滤数据包。我读了一篇使用tos字段进行优先级分配的论文。 – allenchen 2012-07-12 01:02:57

+0

@allenchen当然是的,这就是TOS的用途。通过“路由器”,我当然也应该包括网络桥接主机。 – EJP 2013-08-13 03:49:05