C - TCP校验和(使用原始套接字) - 如何获取IP地址

dav*_*vid 6 c sockets checksum tcp

raw sockets用于发送TCP数据时,允许保留source ip address零,以便内核输入正确的值.这很有用,尤其IP是在使用多个接口(具有不同地址)时.

我现在的问题是:要计算TCP校验和,我需要知道源IP地址到底是什么.这对我来说似乎不可能?

无论如何确定IP我的传出数据包的来源?

(另一种方法是,将我的原始套接字专门绑定到一个地址,但我宁愿不想这样做).

/编辑:使用Linux

cni*_*tar 1

如果你没有绑定你的套接字,内核必须根据目标地址找到源地址。

基本上完成了路由查找并确定了目标接口。之后,从该接口获取 IP:数据包的源。

所以你的问题变成了执行路由查找,方式ip route get就是这样。

编辑

@nos 提到使用不同的套接字(UDP)并将其连接到该目标地址。使用获取其本地绑定名称getsockname应该会为您提供将用于该目的地的源地址。

  • 您可以创建一个 UDP 套接字,将其 connect() 到同一远程 IP(也可能使用 INADDR_ANY 对其进行绑定(bind)),并在其上调用 getsockname() 以了解源地址。它不太可能与您自己的原始套接字数据包的路由不同,除非您应用了一些非常奇怪的 netfilter 规则。 (2认同)