我们有现成的软件定期向本地子网(x.x.x.255)的特定端口(7125)广播UDP数据包。我们在运行HP-UX(11.11)上的监控软件可以轻松接收这些数据包。然而,在将监控软件移植到Linux(RHEL 6.1)后,我们发现它无法接收广播数据包。Tcpdump显示数据包已经到达Linux主机,但内核没有将其发送给我们的软件。
我一直在使用几个模仿socket API调用的Python 2.x脚本来测试不同的场景。如果发送方使用单播(10.1.0.5),Linux内核会将数据包传递给接收程序,但如果使用广播(10.1.0.255)则不行。我已经在网络上搜索了几天,但没有找到任何遇到同样问题的人。有什么想法吗?
receiver.py
from __future__ import print_function
import socket
localHost = ''
localPort = 7125
remoteHost = '10.1.0.5'
remotePort = 19100
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((localHost, localPort))
s.connect((remoteHost, remotePort))
print('Listening on {0}:{1} for traffic from {2}:{3}'.format(localHost, localPort, remoteHost, remotePort))
data = s.recv(1024)
print('Received: {0}'.format(data))
s.close()
sender.py
from __future__ import print_function
import socket
import time
localHost = ''
localPort = 19100
remoteHost = '10.1.0.255'
remotePort = 7125
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((localHost, localPort))
s.connect((remoteHost, remotePort))
data = 'sending this from {0}:{1} to {2}:{3}'.format(localHost, localPort, remoteHost, remotePort)
print(data)
print('2')
time.sleep(1)
print('1')
time.sleep(1)
s.send(data)
print('sent at {0}'.format(time.ctime()))
s.close()
INADDR_BROADCAST
(255.255.255.255,广播的INADDR_ANY
)吗?也就是说,除了像你已经做的那样设置SO_BROADCAST
选项(双方都要设置),还需要进行绑定。你是否检查了所有这些套接字系统调用的错误/返回代码? - Matthew HallINADDR_ANY
并在HP-UX上接收单播和广播数据包。 - goose