У меня есть процесс Python на одной машине Linux server1
, которая получает и обрабатывает необработанные пакеты UDP. Я хочу, чтобы другая Linux-машина server2
способна прослушивать те же UDP-пакеты, которые получает server1
.
Есть ли какое-нибудь решение Python, способное обнюхивать UDP-пакеты, адресованные другой машине (Linux)?
Если вы хотите, чтобы более чем одна машина обрабатывала одни и те же данные, вам было бы лучше отправиться в mulitcast (если вы можете управлять отправителем и инфраструктурой)
Else, http://sourceforge.net/projects/pylibpcap/ будет включать захват пакетов через python. Вам все равно придется настроить инфраструктуру, чтобы получить пакеты на машину, которую вы хотите ее обнюхивать. Либо iptables (если это Linux-машина), либо зеркальный порт на коммутаторе и т.д.
Edit:
Если вы хотите, чтобы процессы на разных машинах (вы думаете, что одна машина не может все это сделать), я бы получил машину Linux, получая данные, и используя iptables, отправьте ее на несколько других компьютеров. Может быть, к другому гнезду на той же машине. Это возможно, потому что его UDP. Если вы хотите, чтобы все это было на одной машине, у меня был бы единственный процесс, который порождает подпроцессы с подключенными PIPE, связывает сокет UDP и копирует данные в каждый канал подпроцесса; возможно после некоторой проверки ввода
Это не зависит от Python, а от вашей сетевой архитектуры. Если server1 и server2 подключены (возможно, они есть) через коммутатор, вы не можете этого сделать, потому что пакет, проходящий через маршрутизатор, будет отправлен только на запрошенный IP.
Итак, прежде всего, расскажите, как составлена ваша сетевая архитектура. Где server1 и server2? Как достичь друг друга?
Решение проблемы не будет зависеть ни от вашей ОС, ни от используемого языка. В любом случае, вы отметили свой вопрос "linux", поэтому я думаю, что вы знакомы с этой ОС. Если это так, и server1 и server2 получают доступ к локальной сети через один и тот же маршрутизатор, вы можете оценить возможность установки linux на вашем маршрутизаторе (посмотрите openwrt), а также выполнять обнюхивание и все, что угодно от самого маршрутизатора.
У меня была аналогичная проблема, и я написал небольшой python script для пересылки входящих пакетов udp для умножения хостов. Недостатком здесь является, конечно, то, что вы теряете исходный IP исходных пакетов udp.
import socket
import sys, time, string
def sendUDP(remotehost,remoteport,UDPSock,data):
UDPSock.sendto( data, (remotehost,remoteport))
def serverLoop(listenport,remotes):
# Set up socket
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.bind( ("0.0.0.0",listenport) )
while 1:
data, addr = UDPSock.recvfrom(1024)
if not data: pass
else:
sys.stdout.write(".") ; sys.stdout.flush()
# Send udp packet to remotes...
for remote in remotes:
if remote[0] == addr: pass
else: sendUDP(remote[0],remote[1],UDPSock,data)
time.sleep(0.001)
if __name__ == "__main__":
if len(sys.argv) < 3:
print "%s listenport remotehost1:port1 remotehostN:portN ..." % sys.argv[0]
sys.exit(-1)
listenport = int(sys.argv[1])
print "Local foward port %d" % listenport
remotes = []
for pair in sys.argv[2:]:
host,port = string.split(pair,":")
remotes.append( (host,int(port)) )
print "Adding remote forward %s:%s" % (host,port)
print "Starting serverloop"
serverLoop(listenport,remotes)