ローカルサブネット(xxx255)の特定のポート(7125)にUDPパケットを定期的にブロードキャストする既存のソフトウェアがあります。HP-UX(11.11)で実行されている監視ソフトウェアがあり、これらのパケットを問題なく受信できます。ただし、監視ソフトウェアをLinux(RHEL 6.1)に移植した後、ブロードキャストパケットを受信しないことがわかりました。tcpdumpは、Linuxホストに到着するパケットを表示しますが、カーネルはそれらをソフトウェアに送信しません。
私は、監視ソフトウェアがさまざまなシナリオをテストするために使用するソケットAPI呼び出しを模倣するPython2.xスクリプトをいくつか使用しています。送信者がユニキャスト(10.1.0.5)を使用しているが、ブロードキャスト(10.1.0.255)を使用していない場合、Linuxカーネルはパケットを受信者ソフトウェアに渡します。私は数日間ウェブを検索してきましたが、同じ問題を抱えている人は見つかりませんでした。何か案は?
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()