So ändern Sie eine Buchse des IP_MULTICAST_IF

Ich habe einen Computer mit 5 Schnittstellen: 3 mit öffentlicher IP-Adressen und 2 lokale IPs. Ich bin versucht zu senden "HALLO" zu einem UDP-server, aber das möchte ich ändern Sie die Schnittstelle, um eine der lokalen IP-Adressen. Ich habe einige der Forschung, und dies ist die Linie, die ich brauche, um hinzuzufügen in python:

sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton("64.195.10.11"))

mit 64.195.10.11 die IP, die ich ändern wollen, um

Also mein python-code sieht wie folgt aus:

import socket

MCAST_GRP = '224.0.0.1'
MCAST_PORT = 10222

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton("64.195.10.10"))
sock.sendto("HELLO", (MCAST_GRP, MCAST_PORT))

Funktioniert es tadellos, wenn ich zwischen meinen 3 öffentlichen IP-Adressen. Jedoch funktioniert es nicht (Paket ist nicht geliefert), wenn ich eine lokale IP in die Diskussion. Ich bin nicht sicher, ob das script nicht senden, oder der server nicht erhalten. Was ist passiert?

SL

Edit: ich bin-hören mit zwei Möglichkeiten:

import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", 10222))
sock.setsockopt(socket.IPPROTO_IP,
                                 socket.IP_ADD_MEMBERSHIP,
                                 socket.inet_aton("224.0.0.1") +
                                 socket.inet_aton("64.195.10.11"))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0)

while True:
    print >>sys.stderr, '\nwaiting to receive message'
    data, address = sock.recvfrom(1024)

    print >>sys.stderr, 'received %s bytes from %s' % (len(data), address)
    print >>sys.stderr, data

    print >>sys.stderr, 'sending acknowledgement to', address
    sock.sendto('ack', address)

und mit twisted:

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
from twisted.application.internet import MulticastServer

class MulticastServerUDP(DatagramProtocol):
    def __init__ (self, group, name):
        self.group = group
        self.name = name
    def startProtocol(self):
        print '%s Started Listening' % self.group
        self.transport.joinGroup(self.group)

    def datagramReceived(self, datagram, address):
        print "%s Received:"%self.name + repr(datagram) + repr(address)

reactor.listenMulticast(10222, MulticastServerUDP('224.0.0.1', 'SERVER1'), listenMultiple = True)             
reactor.run()
  • "es funktioniert nicht" ist keine sehr hilfreiche Beschreibung des Problems. Hat die setsockopt gelingen oder scheitern? Hat die sendto gelingen oder scheitern?
  • der server und die lokale Adresse(private Adresse), die Sie testen möchten, auf der gleichen Maschine?
  • Ich bin nicht ein problem mit diesem code überhaupt verwenden, wenn ich ein RFC 1918 Adresse; wireshark zeigt die multicast-Paket geht ohne Probleme
  • ja, Sie sind auf der gleichen Maschine.
  • Schwartz: Keine Fehler im code. beide dann zum Erfolg. Der server hat einfach nicht das Paket empfangen soll.
  • Pennington: So wohl die server einfach nicht empfangen Pakete aus dem RFC 1918. Haben Sie eine Idee, warum es tun?
  • bitte erfassen Sie das Paket mit tshark -Vi <interface_name> udp and port 10222. Ich kann nur raten, aber wenn es aus der mcast-server (und es ist), dann müssen wir etwas Weg, um zu diagnostizieren, was falsch ist. Wie ist Ihre Maschine "hören" für dieses Paket?
  • Ich bearbeitet meine Frage, gehören die listening-code.
  • Könnten Sie näher auf die unicast RFC 1918 IPv4-Quell-Adresse des listener-Maschine?
  • das ist die IP von der Schnittstelle will ich als Standard festlegen. Es ist die private IP, die ich haben Probleme mit. Wenn ich auf die 64.195.10.11 in Absender und Empfänger, dann wird das Paket empfangen.
  • Lassen Sie uns also klar sein, möchten Sie zum senden der multicast von einer unicast-Adresse 64.194.10.11, um eine RFC-1918-Adresse? Wenn nicht, bitte ausdrücklich darauf hinweisen, die unicast-Adressen der Absender und Empfänger, denn es ist durchaus möglich, dein problem ist grundlegender als alles, was mit Python zu tun
  • Ich möchte zum senden einer multicast von einer Schnittstelle, die mit privaten IP-Adresse (RFC 1918 in diesem Fall), aber um dies zu tun, muss ich noch ändern die Standard-Schnittstelle, die IP-64.194.10.11. Der Empfänger kommt in die Gruppe 224.0.0.1 zu hören.
  • Bitte ändern Sie Ihre sender und Hörer die multicast-Adresse "239.0.0.1" und lassen Sie mich wissen, ob dies hilft, bitte Sag mir, dass der sender und der Hörer sind mit dem gleichen ethernet-switch und im selben Vlan
  • Ich ersetzte 224.0.0.1 mit 239.0.0.1, und es immer noch nicht erhalten.
  • Sind der Absender und der listener mit dem gleichen ethernet-switch und im selben vlan? Wenn nicht, sagen Sie uns, wie Sie diese weitergeleitet
  • Tatsächlich, ich denke, es ist ein firewall-Problem. Lassen Sie mich dies bestätigen.
  • Wenn es eine firewall zwischen Ihrem sender und Empfänger, dann haben Sie sehr wahrscheinlich Probleme mit der firewall... Sie neigen dazu, Probleme zu verursachen, die für multicast-Konfigurationen
  • Ja, in der Tat ist es ein firewall-problem. Ich danke Ihnen aufrichtig für Ihre Hilfe!

Schreibe einen Kommentar