通过RAW套接字发送带IP包的缓冲区

时间:2014-07-29 08:03:28

标签: c sockets

假设我有一个带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)

因此消息不会发送到服务器。我做错了什么? 感谢。

0 个答案:

没有答案