【问题标题】:Python - Sockets set SO_BROADCAST for one sendingPython - 套接字为一次发送设置 SO_BROADCAST
【发布时间】:2017-11-18 14:08:31
【问题描述】:

我有一个使用套接字发送数据的发送器类:

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)

这里不起作用的原因是因为我的发件人可能会发送广播或向 ips 发送消息。

我将如何设置SO_BROADCAST 仅在发送广播而不创建单独的发送方类和实例时:SenderBroadcastSender

提前致谢!

【问题讨论】:

  • 如果使用s.socket(s.AF_INET, s.SOCK_DGRAM)你不能发送广播消息!您想要低级别访问但使用高级课程。 RAW socket 只能发送这个,其他连接(TCP/UDP)得到目标(IP/PORT)。我的报价不使用复制/粘贴代码,否则会错过很多信息。 (RAW 需要 root/administrator 权限)。
  • 当我说广播消息时,我的意思是向广播端口发送消息,即255.255.255.255,其他人正在侦听来自该 IP 的消息。不管怎样,我刚刚想出了一个解决方案。
  • 为什么?设置它不会阻止您进行单播。打开时只需将其放在插座上即可。然后你可以单播和广播。
  • @user207421 很好,我不知道谢谢

标签: python sockets udp broadcasting


【解决方案1】:

新答案

正如@user207421所说:

为什么?设置它不会阻止您进行单播。只需设置它 打开时的插座。然后你可以单播和广播。


老答案

要允许您的套接字向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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-06-14
    • 1970-01-01
    • 2012-04-26
    • 2011-07-09
    相关资源
    最近更新 更多