精制数据包的目标IP与原始套接字的目标IP参数之间的差异send()

时间:2013-06-03 21:28:04

标签: networking network-programming raw-sockets

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

如果我创建了一个IP数据包(icmp,tcp或udp数据包),那么源和目标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更改,但将由网内路由器处理。

我的理解是否正确?还有其他差异吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

  1. G.R。赖特& W.R. Stevens, TCP / IP Illustrated,第二卷:实施,第1057-1062页。