python - 绑定(bind)到 0.0.0.0 时查找源 IP 地址

标签 python python-sockets

将 UDP 套接字绑定(bind)到 ("", 1234)("0.0.0.0", 1234) 时,是否可以找出哪个 IP 地址它实际上会发送自?

正如您在下面的代码中看到的,getsockname 只告诉我绑定(bind)到的内容。但是当我发送一个数据包时,我可以看到 IP 地址在我的例子中是 10.0.0.2

我是否必须通过查看我的网络接口(interface)自己推断出这个地址?如果是这样,那很好,但是是否有可靠的方法来做到这一点?

from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("", 1234))
print(s.getsockname()) # prints ("0.0.0.0", 1234)
s.sendto("hello", ("10.0.0.3", 1234)) # sends from 10.0.0.2

我试过

import socket
print(socket.gethostbyname(socket.gethostname()))

但这似乎不是很可靠(在我期望 10.0.0.2 的情况下,我得到了 127.0.1.1)。

我意识到通过绑定(bind)到 0.0.0.0,我绑定(bind)到所有 本地网络接口(interface)。这是否意味着当我尝试发送某些内容时,我的源 IP 地址将由路由表决定?如果是这样,我仍然可以通过 Python 以可靠的方式获取该地址吗?

最佳答案

发送时使用的IP地址将在发送数据包时由路由表确定。 可能有查询该路由表的特定于平台的方法,但是一种相当可移植的方法是 首先连接()套接字。

您也可以使用另一个套接字来查询此信息。例如

from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("", 1234))
print(s.getsockname()) # prints ("0.0.0.0", 1234)
sq = socket(AF_INET, SOCK_DGRAM)
sq.connect(("10.0.0.3", 1234))
print(sq.getsockname()[0])
sq.close()
s.sendto("hello", ("10.0.0.3", 1234)) # sends from 10.0.0.2

关于python - 绑定(bind)到 0.0.0.0 时查找源 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22857389/

相关文章:

python - 什么反ddos安全系统python用于套接字TCP连接?

python - 尝试使用套接字和 tkinter 制作服务器应用程序

Python socket.recv 未从页面获取所有数据

python - python 中的 Spacy 问题

python - 为什么 pickle 会使我的 Flask 服务器崩溃?

python - 使用 optparse 接受参数的大多数 pythonic 方式

python - 如何使用 python 套接字模块向远程计算机发送消息?

python - Python-除了ctrl-c外,还可以通过键盘输入安全地关闭终端上的套接字连接吗?

python - scikit-learn 中是否有任何类型的子空间聚类包可用

python - 从 linux 中删除不需要的 python 包