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字段设置成功的情况下发送数据包。但是我应该怎么做才能使消息优先生效?谢谢!
你应该用tc设置你的机器,以确保0x28在出口队列上获得更高的优先级。 – marcorossi 2015-06-20 00:31:13