Python-Sockets为一次发送设置SO_广播

Python-Sockets为一次发送设置SO_广播,python,sockets,udp,broadcasting,Python,Sockets,Udp,Broadcasting,我有一个sender类,用于使用套接字发送数据: import socket as s class Sender: def __init__(self): self.socket = s.socket(s.AF_INET, s.SOCK_DGRAM) self.socket.setsockopt(s.SOL_SOCKET, s.SO_REUSEADDR, 1) def send(self, msg, addr): self.so

我有一个sender类,用于使用套接字发送数据:

import socket as s

class Sender:
    def __init__(self):
        self.socket = s.socket(s.AF_INET, s.SOCK_DGRAM)
        self.socket.setsockopt(s.SOL_SOCKET, s.SO_REUSEADDR, 1)

    def send(self, msg, addr):
        self.socket.sendto(msg, addr)
我可以创建
Sender
的实例来发送数据:

sender = Sender()
sender.send("Message example", (ip, port))
问题是发件人可能希望向
255.255.255.255
发送广播

通常,对于广播,我会:

self.socket.setsockopt(s.SOL_SOCKET, s.SO_BROADCAST, 1)
这在这里不起作用的原因是,我的发件人可能会向IP发送广播或消息

只有在发送广播而不创建单独的发送者类和实例时,我如何设置
SO\u BROADCAST
BroadcastSender


提前谢谢

新答案

如前所述:


为什么??设置它不会阻止您单播。把它打开就行了 当你打开插座时,把它打开。然后您可以同时进行单播和广播


旧答案

要允许套接字向
255.255.255.255
(广播)发送消息,可以执行以下操作

内部
Sender
类:

def send(self, msg, addr):
    if addr[0] == "255.255.255.255": self.socket.setsockopt(s.SOL_SOCKET, s.SO_BROADCAST, 1)
    self.socket.sendto(msg, addr)
    if addr[0] == "255.255.255.255": self.socket.setsockopt(s.SOL_SOCKET, s.SO_BROADCAST, 0)

新答案

如前所述:


为什么??设置它不会阻止您单播。把它打开就行了 当你打开插座时,把它打开。然后您可以同时进行单播和广播


旧答案

要允许套接字向
255.255.255.255
(广播)发送消息,可以执行以下操作

内部
Sender
类:

def send(self, msg, addr):
    if addr[0] == "255.255.255.255": self.socket.setsockopt(s.SOL_SOCKET, s.SO_BROADCAST, 1)
    self.socket.sendto(msg, addr)
    if addr[0] == "255.255.255.255": self.socket.setsockopt(s.SOL_SOCKET, s.SO_BROADCAST, 0)

如果使用
s.socket(s.AF_INET,s.SOCK_DGRAM)
则无法发送广播消息!您需要低级访问,但使用高级类
RAW
socket只能发送此消息,其他连接(
TCP
/
UDP
)已获得目标(IP/端口)。我的报价不使用复制/粘贴代码,否则会错过很多信息。(
RAW
required
root/administrator
permission)。当我说广播消息时,我的意思是将消息发送到广播端口,即
255.255.255
其他人正在侦听来自该ip的消息。我刚刚想出了一个解决办法。为什么?设置它不会阻止您单播。当你打开它时,把它放在插座上。然后您可以同时进行单播和广播。@user207421很好,我不知道如果使用
s.socket(s.AF\u INET,s.SOCK\u DGRAM)
您不能发送广播消息!您需要低级访问,但使用高级类
RAW
socket只能发送此消息,其他连接(
TCP
/
UDP
)已获得目标(IP/端口)。我的报价不使用复制/粘贴代码,否则会错过很多信息。(
RAW
required
root/administrator
permission)。当我说广播消息时,我的意思是将消息发送到广播端口,即
255.255.255
其他人正在侦听来自该ip的消息。我刚刚想出了一个解决办法。为什么?设置它不会阻止您单播。当你打开它时,把它放在插座上。然后你可以单播和广播。@user207421不错,我不知道,谢谢