C/C++ 设置Socket的IP_TOS选项

IP TOS选项是指示IP报文转发的优先级,QOS控制的一种,常规的IP协议TOS都为0,就是普通报文。

设置:

IPV4/TOS设置(Socket),IPTOS_LOWDELAY 表示FLASH优先级(一般用在游戏,即时通信这块,因为需要包转发要足够快)

        bool Socket::SetTypeOfService(int fd, int tos) noexcept {
            if (fd == -1) {
                return false;
            }

            if (tos < 0) {
                tos = IPTOS_LOWDELAY; 
            }

            Byte b = tos; /* IPTOS_LOWDELAY */
#if defined(_MACOS)
            return ::setsockopt(fd, IPPROTO_IP, IP_TOS, (char*)&b, sizeof(b)) == 0;
#else
            return ::setsockopt(fd, SOL_IP, IP_TOS, (char*)&b, sizeof(b)) == 0;
#endif
        }

设置

IPV4/IPV6 TOS设置(Socket)

        void Socket::AdjustDefaultSocketOptional(int sockfd, bool in4) noexcept {
            if (sockfd != -1) {
                uint8_t tos = IPTOS_LOWDELAY;
                if (in4) {
                    if (SOCKET_RESTRICTIONS_.IP_TOS_ON) {
#if defined(_MACOS)
                        ::setsockopt(sockfd, IPPROTO_IP, IP_TOS, (char*)&tos, sizeof(tos));
#else
                        ::setsockopt(sockfd, SOL_IP, IP_TOS, (char*)&tos, sizeof(tos));
#endif
                    }

#if IP_DONTFRAGMENT
                    int dont_frag = IP_PMTUDISC_DO;
                    ::setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAGMENT, (char*)&dont_frag, sizeof(dont_frag));
#elif IP_PMTUDISC_WANT
                    int dont_frag = IP_PMTUDISC_WANT;
                    ::setsockopt(sockfd, IPPROTO_IP, IP_MTU_DISCOVER, &dont_frag, sizeof(dont_frag));
#endif
                }
                else {
                    // linux-user: Add missing IP_TOS, IPV6_TCLASS and IPV6_RECVTCLASS sockopts
                    // QEMU:
                    // https://patchwork.kernel.org/project/qemu-devel/patch/20170311195906.GA13187@ls3530.fritz.box/
#if IPV6_TCLASS
                    if (SOCKET_RESTRICTIONS_.IPV6_TCLASS_ON) {
                        ::setsockopt(sockfd, IPPROTO_IPV6, IPV6_TCLASS, (char*)&tos, sizeof(tos)); /* SOL_IPV6 */
                    }
#endif

#if IPV6_MTU_DISCOVER && IPV6_PMTUDISC_WANT
                    int dont_frag = IPV6_PMTUDISC_WANT;
                    ::setsockopt(sockfd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &dont_frag, sizeof(dont_frag));
#endif
                }

#if defined(SO_NOSIGPIPE)
                int no_sigpipe = 1;
                ::setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe, sizeof(no_sigpipe));
#endif
            }
        }

相关推荐

  1. C/C++ 设置SocketIP_TOS选项

    2024-03-27 03:16:02       41 阅读
  2. Socket Shutdown

    2024-03-27 03:16:02       57 阅读
  3. 使用.cc域名优势

    2024-03-27 03:16:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 03:16:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 03:16:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 03:16:02       87 阅读
  4. Python语言-面向对象

    2024-03-27 03:16:02       96 阅读

热门阅读

  1. LeetCode 93. 复原 IP 地址

    2024-03-27 03:16:02       41 阅读
  2. C# 类 结构体

    2024-03-27 03:16:02       40 阅读
  3. SSH公钥(SSH Key)生成方法

    2024-03-27 03:16:02       44 阅读
  4. 判断对象存活的算法

    2024-03-27 03:16:02       36 阅读
  5. node项目中express的使用

    2024-03-27 03:16:02       47 阅读
  6. 20240325_AI小字典

    2024-03-27 03:16:02       35 阅读
  7. android 13长按power键没有关机菜单

    2024-03-27 03:16:02       37 阅读
  8. leetcode77.组合

    2024-03-27 03:16:02       41 阅读
  9. C语言获取输出相关函数scanf、gets、fgets等

    2024-03-27 03:16:02       46 阅读
  10. 使用 python 拆分 excel 文件

    2024-03-27 03:16:02       40 阅读
  11. 电子商务类网站搭建需要注意的几点。

    2024-03-27 03:16:02       43 阅读
  12. springboot如何通过注解优雅实现接口多版本管理

    2024-03-27 03:16:02       36 阅读