我的操作系统项目在服务器和客户端之间有一个基于套接字的通信设置。我设置 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 标头控制?
// 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 标头的方式。