在两台本地计算机之间使用UDP发送而不使用Python3知道IP地址

时间:2020-06-10 12:20:40

标签: python-3.x sockets udp ip

我正在尝试开发一个应用程序,以将json字符串从无线网络上的一台计算机发送到另一台(或电话)。问题在于它必须在不知道接收计算机的IP地址的情况下工作。

如果我知道要发送到的IP地址,则以下代码有效

# UDP Server
import socket

IP = "123.123.123.123" # Not actual IP address
PORT = 66666

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((IP,PORT))

while True:
    data, addr = sock.recvfrom(1024)
    print(f"recieved message: {data} from: {addr}")


# UDP Client
import socket

IP = "123.123.123.123" # Not actual IP address
PORT = 66666

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

MSG = b"Hello there"

sock.sendto(MSG, (IP, PORT))

我还可以使用sock.getsockname()[0]获取当前IP地址并进行监听,但是发送该怎么办?

我已经阅读了一些教程,有人说使用0.0.0.0发送或收听所有地址,但是对此一无所获。另一个想法是在两端使用192.0.0.1进行侦听并发送到路由器,但随后出现“ OSError:[WinError 10049]请求的地址在其上下文中无效”

我考虑过使用广播,但已经读到从ipv6开始使用,这是非常糟糕的做法。

我阅读了有关使用多播的建议,但是是否有一种方法可以获取本地网络上计算机的所有IP地址以进行使用?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

感谢rdas的帮助,我将我引向https://gist.github.com/ninedraft/7c47282f8b53ac015c1e326fffb664b5,并设法通过以下方法解决了该问题;

# UDP Server
import socket

PORT = 66666

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROT_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind(("",PORT))

while True:
    data, addr = sock.recvfrom(1024)
    print(f"recieved message: {data} from: {addr}")


# UDP Client
import socket

PORT = 66666

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROT_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

MSG = b"Hello there"

sock.sendto(MSG, ('<broadcast>', PORT))