我想使用原始套接字发送TCP数据包,这是一个完整的IP数据包(因此数据包有IP头,TCP头和TCP有效负载,但没有以太网头.IP源和目标地址在WLAN中, 192.168.0.105和192.168.0.103),包含以下代码
int on;
on = 0;
if ((sendfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("raw socket");
exit(1);
}
if (setsockopt(sendfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(1);
}
nr_bytes = sendto(sendfd, packet, ip_len, 0, (struct sockaddr*)&client_addr, addr_len);
我使用TCPdump来捕获已发送的数据包,并注意它已向IP数据包添加了额外的IP头,并且IP协议号为255(ip-> ip_p为255)。所以它有两个IP头(具有相同的src和dst IP对),这是意料之外的。
有什么问题?谢谢!
答案 0 :(得分:2)
使用IPPROTO_RAW
隐式启用选项IP_HDRINCL
在致电setsockopt()
时,您再次停用IP_HDRINCL
,因为您设置了on = 0
请尝试删除setsockopt()
或设置on = 1
。