4

IP ヘッダーには、サービスの種類 (TOS) フィールドがあります。Classful Queueing Disciplines、つまり PRIO の設定に使用できます。

次のコードをテストしました。

#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 フィールドが正常に設定された状態で送信できます。しかし、メッセージの優先度を有効にするにはどうすればよいでしょうか? ありがとう!

4

2 に答える 2

1

TOS はルーターへの指示です。パス内のすべてのルーターがその意味に同意し、それをそのまま次のルーターに渡し、自分で何かをしない限り、効果はありません。彼らは?また、パスにルーターがない場合は、まったく効果がありません。

于 2012-07-11T10:40:48.197 に答える