IP_HDRINCL 问题导致客户端在原始套接字通信中丢失数据包

问题描述 投票:0回答:1

我的操作系统项目在服务器和客户端之间有一个基于套接字的通信设置。我设置 IP_HDRINCL 选项来手动添加 IP 标头,但这会中断通信 — 服务器发送数据包,但客户端不接收它们。当我禁用 IP_HDRINCL 时,通信按预期工作。

这是我设置选项的代码片段:

if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, reinterpret_cast<const char*>(&optval), sizeof(optval)) < 0) {
    std::cerr << "Failed to set IP_HDRINCL" << std::endl;
    return INVALID_SOCKET;
} 

什么可能导致此问题?是否有其他方法可以在不中断客户端与服务器通信的情况下实现手动 IP 标头控制?

c++ sockets network-programming tcp raw-sockets
1个回答
0
投票

    // Fill in IP header
    iph->ip_v = 4; // IPv4
    iph->ip_hl = IP_HEADER_SIZE / 4; // Header length in 32-bit words
    iph->ip_tos = 0; // Default Type of Service
    iph->ip_len = htons(IP_HEADER_SIZE + TCP_HEADER_SIZE); // Total length of the packet
    iph->ip_id = 0; // Identification (random value or 0)
    iph->ip_off = 0; // Fragment offset
    iph->ip_ttl = 255; // Time to Live
    iph->ip_p = IPPROTO_TCP; // Protocol (TCP)
    iph->ip_src.s_addr = src.sin_addr.s_addr; // Source IP address
    iph->ip_dst.s_addr = dst.sin_addr.s_addr; // Destination IP address

    // Calculate IP header checksum
    calculate_ip_checksum(iph);

这就是我构建 IP 标头的方式。

© www.soinside.com 2019 - 2024. All rights reserved.