Python 服务器是否可以在未配置IP的情况下侦听UDP消息
请看下面的python代码。 我创建了一个服务器类来监听端口10000以接收UDP广播消息 如果在系统中配置了IP地址,则可以接收UDP广播消息。如果未配置ip地址,则无法接收任何消息 你能告诉我为什么吗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
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数据包。它不使用阻止套接字,而是使用选择来监视套接字状态。