Python 服务器是否可以在未配置IP的情况下侦听UDP消息

Python 服务器是否可以在未配置IP的情况下侦听UDP消息,python,udp,broadcast,Python,Udp,Broadcast,请看下面的python代码。 我创建了一个服务器类来监听端口10000以接收UDP广播消息 如果在系统中配置了IP地址,则可以接收UDP广播消息。如果未配置ip地址,则无法接收任何消息 你能告诉我为什么吗 import socket import sys class Server: class Handler: def handle(self, message): pass def __init__(self, serial

请看下面的python代码。 我创建了一个服务器类来监听端口10000以接收UDP广播消息

如果在系统中配置了IP地址,则可以接收UDP广播消息。如果未配置ip地址,则无法接收任何消息

你能告诉我为什么吗

import socket
import sys

class Server:

    class Handler:

        def handle(self, message):
            pass

        def __init__(self, serialNo):
            self.serialNo = serialNo

        def _setAddress(self, socket, message, address):
            self.message = message
            self.address = address
            self.socket = socket

        def send(self, message):
            self.socket.sendto(message, self.address)

        def getSerialNo(self):
            return self.serialNo

    def __init__(self, port, handler):
        self.ss = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.ss.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.ss.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        self.handler = handler

        try:
            self.ss.bind(('<broadcast>', port))
        except:
            self.ss.close()
            raise RuntimeError("Create socket error")
        self.ss.setblocking(1)

    def loop(self):
        while True:
            try:
                print "Listening for broadcast..."
                message, address = self.ss.recvfrom(8192)
                print "Got request from %s:%s" % (address, message)
                self.handler._setAddress(self.ss, message, address)
                self.handler.handle(message)
            except (KeyboardInterrupt, SystemExit):
                raise
            except:
                sys.exc_info()[0]
导入套接字
导入系统
类服务器:
类处理程序:
def句柄(自身,消息):
通过
定义初始化(self,serialNo):
self.serialNo=serialNo
def_设置地址(自身、套接字、消息、地址):
self.message=消息
self.address=地址
self.socket=socket
def发送(自我,信息):
self.socket.sendto(消息,self.address)
def getSerialNo(自身):
返回self.serialNo
定义初始化(自身、端口、处理程序):
self.ss=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.ss.setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
self.ss.setsockopt(socket.SOL_socket,socket.SO_广播,1)
self.handler=handler
尝试:
自我ss.绑定(('',端口))
除:
self.ss.close()
引发运行时错误(“创建套接字错误”)
自锁(1)
def回路(自):
尽管如此:
尝试:
打印“收听广播…”
消息,地址=self.ss.recvfrom(8192)
打印“从%s获得请求:%s”%(地址、消息)
self.handler.\u setAddress(self.ss、消息、地址)
self.handler.handle(消息)
除了(键盘中断、系统退出):
提升
除:
sys.exc_info()[0]

参考pydhcp客户端代码后,我做了以下更改:

import socket
import sys
import select

class Server:

    class Handler:

        def handle(self, message):
            pass

        def __init__(self, serialNo):
            self.serialNo = serialNo

        def _setAddress(self, socket, message, address):
            self.message = message
            self.address = address
            self.socket = socket

        def send(self, message):
            self.socket.sendto(message, self.address)

        def getSerialNo(self):
            return self.serialNo

        def __init__(self, port, handler):
            self.ss = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            self.ss.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.ss.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
            self.handler = handler

        try:
            self.ss.bind(("0.0.0.0", int(port)))
        except:
            self.ss.close()
            raise RuntimeError("Create socket error")

        def loop(self):
            while True:
            try:
                print "Listening for broadcast..."
                data_input,data_output,data_except =    select.select([self.ss],[],[], 60)
            if (data_input != []):
               (message, address) = self.ss.recvfrom(2048)
               print "Got request from %s:%s" % (address, message)
               self.handler._setAddress(self.ss, message, address)
               self.handler.handle(message)
            else:
               print "no data within 60 seconds"
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            sys.exc_info()[0]

现在它可以接收广播数据包,但无法在RedHat上工作。

您所说的“系统中配置的IP”是什么意思?IP是网络堆栈中的一层,而UDP是一种网络协议?如果您没有IP地址并且没有连接到任何网络,您希望得到什么消息?@syntonym,当没有配置IP地址时,希望得到一些广播消息。@JeffCai UDP是在IP之上定义的。如果无法获取IP消息(如果没有IP,则无法获取),则无法获取UDP消息。虽然您应该获取或广播消息。@syntonym,当没有配置ip地址时,主机仍然可以接收DHCP提供消息,这是一种ip数据包。它不使用阻止套接字,而是使用选择来监视套接字状态。