UDP socket: "No route to host"

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

Hallo zusammen,

ich spiele gerade ein wenig mit UDP Hole Punching und bekomme seltsamerweise immer wieder einen "No route to host" Fehler.

Zuerst der Code:

Code: Alles auswählen

#!/usr/bin/env python

import sys
import socket
import time


def send_udp(sock, delay):
    print ('delay: ' + str(delay) + ' sec.').ljust(18),
    for i in range(10):
        try:
            tmp = sock.send('my teststring')
            sys.stdout.write('.'); sys.stdout.flush()
        except socket.error, e:
            if e[1] == 'No route to host':
                sys.stdout.write('!'); sys.stdout.flush()
        time.sleep(delay)
    print ''


sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((socket.gethostname(), 50123))
sock.connect(('72.14.221.104', 50456))     # google.de
#sock.connect(('private ip', 50456))

print ''

send_udp(sock, 0)
send_udp(sock, 0.5)
send_udp(sock, 1)
send_udp(sock, 1.5)
Zu google.de sieht das aus wie erwartet:
google.de hat geschrieben: delay: 0 sec. ..........
delay: 0.5 sec. ..........
delay: 1 sec. ..........
delay: 1.5 sec. ..........
Zu einer privaten IP hingegen geht da dann aber etwas schief:
private ip hat geschrieben: delay: 0 sec. ..........
delay: 0.5 sec. .!.!.!.!.!
delay: 1 sec. .!.!.!.!.!
delay: 1.5 sec. .!.!.!.!.!
Woran kann das denn liegen? Die Gegenseite ist eine Fritzbox.

Mir ist schon klar, dass das eher ein Netzwerkproblem ist, aber vielleicht kann mir hier ja jemand helfen.

Fragen? => Ganz laut schreien! : - )

Vielen dank schon mal und schöne Grüße,
el_bobo
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

UDP + connect scheint mir nicht so ganz korrekt zu sein.
Versuch mal mit sendto und ohne connect

http://www.evolt.org/article/Socket_Pro ... /17/60276/
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

Naja, also zu anderen Hosts funktioniert es auch.

Schon klar, dass UDP stateless ist, aber ich vermute bei UDP ist connect() dann einfach ein alias für sendto() mit dem Unterschied, dass er sich eben den Adressaten merkt. Das habe ich aber nicht überprüft.

Ich bin eher der Meinung dass die Fritzbox da den Fehler zurück gibt.

Gruß.
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

Falls es noch jemanden interessiert:

Die Fritzbox macht sehr unfreundliches NAT und mappt in der Regel interne Ports (linear) auf fünfstellige externe Ports.

Schickt man nun UDP Pakete an extern geschlossene Ports, so scheint die Box manchmal nichts und manchmal "no route to host" zu antworten.

Gruß.
Antworten