假设我有一个带IP消息的缓冲区(SYN / ACK或其他),所有标头 - TCP和IP都被填充,依此类推。我想通过raw socket发送它。
当我执行此
时void send_ip(void* data, u16_t len) {
std::cout << "begine of send_ip" << std::endl;
int s;
struct sockaddr_in dst_addr;
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("error:");
exit(EXIT_FAILURE);
}
const int hdrincl = 1;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, &hdrincl, sizeof(hdrincl));
dst_addr.sin_family = AF_INET;
dst_addr.sin_port = 6667;
inet_aton("172.17.9.71", &dst_addr.sin_addr);
std::cout << "before send in send_ip, len = " << (u16_t)len << std::endl;
if (sendto(s, data, len, 0,
(struct sockaddr *)&dst_addr, (socklen_t)sizeof(dst_addr)) < 0) {
perror("sendto ERROR :");
}
else{
}
}
我得到了
sendto ERROR :: Invalid argument
当我将其更改为
时 s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)
带走
setsockopt(s, IPPROTO_IP, IP_HDRINCL, &hdrincl, sizeof(hdrincl));
我可以发送,但在Wireshark中有一条消息
110539 1059.796163000 172.17.9.210 172.17.9.71 TCP 78 65535 > 65535 [SYN, RST,
Reserved] Seq=0 Win=1, bogus TCP header length (0, must be at least 20)
因此消息不会发送到服务器。我做错了什么? 感谢。