0

我想使用原始套接字发送数据包。

如果我创建一个 IP 数据包(icmp、tcp 或 udp 数据包),那么源 IP 和目标 IP 在 IP 数据包中。现在我想通过以下几行发送它:

    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr(dst_ip);
    sendto(sd, packet, 60, 0, (struct sockaddr *)&sin, sizeof(sin));

当然,dst_ip应该与数据包中的目的IP相同。

我想知道如果dst_ip与数据包中的目标 IP 不同会发生什么。在我看来,dst_ip用于决定应该使用哪个 NIC 来发送数据包。而精心制作的数据包中的目标IP不会dst_ip被网络内路由器更改并将由网络内路由器处理。

我的理解是否正确?还有其他区别吗?

谢谢!

4

1 回答 1

0

BSD 的答案是源代码中的注释rip_output():1 “如果用户交给我们一个完整的数据包,请使用它。否则,为标头分配一个 mbuf 并填写它”[即,从提供给的地址sendto()]。

对于其他系统,您将不得不阅读一些内核源代码。

  1. GR Wright 和 WR Stevens,TCP/IP 图解,第二卷:实施,第 1057-1062 页。
于 2013-06-04T04:34:58.033 回答