TCP - UDP Timeout - Aber wieso ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Chugy
User
Beiträge: 7
Registriert: Sonntag 1. März 2015, 15:14

Hey liebe Python Community.

Ich möchte einen simplen Chat in Python schreiben. Ob er nun per UDP oder TCP läuft, ist erstmal irrelevant. Fakt ist, dass der Script im Localhost und im eingenen Netzwerk funktioniert, aber nicht wenn ich es mit einem Externen PC versuchen will.

Hier die beiden Codes ( ABSOLUTE BASIC SCRIPTE )

Client :

Code: Alles auswählen

import socket

ip = "xx.xxx.xx.xxx"
port = int(input("port : "))
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
print("verbunden...")

try:
    while True:
        nachricht = input("Deine Nachricht : ")
        s.send(nachricht.encode())
        antwort = s.recv(1024)
        print("[{}] {}".format(ip, antwort.decode()))
finally:
    s.close()
Server :

Code: Alles auswählen

import socket

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.bind(("xxx.xxx.xx.xxx", 5010))


s.listen(20)


try:
    while True:

        komm, addr = s.accept()
        print("Server ist bereit Daten aufzunehmen...")
        print("Suche Verbindungen...")        
        while True:
            data = komm.recv(1024)
            if not data:
                komm.close()
                break
            print("[{}] {}".format(addr[0], data.decode()))
            nachricht = input("Deine Nachricht : ")
            komm.send(nachricht.encode())
finally:
    s.close()

Wir haben den Server-Script auf einen Windows 2012 und einem Linux Server hochgeladen. DORT HAT DIE COMMUNICATION PERFEKT FUNKTIONIERT. Sobald ich es aber über meinen PC laufen lassen will, um mit meinem Kumpel zu schreiben ----> dann geht es nicht. Dann gibts nen TimeOut und keine Reaktion der anderen Seite.

Bei den Servern gehts - und bei uns NICHT.

Warum ?
Wir haben bereits probiert die Ports freizuschalten und solche Späßchen aber das war alles völlig für umsonst. Firewall haben wir ebenfalls abgeschaltet. (auch erfolgslos...)

Die Frage die ich mir gerade stelle ist, wie kann ich bitte ein Multiplayer SPiel Hosten _____>>>> wenn mein SIMPLER TCP SCRIPT nicht einmal funktioniert ? Kann mir das bitte mal jemand erklären ? Ich habe keine Ahnung an wem ich mich sonst noch wenden soll....

EDIT : WinnError Code [ 10060 ] Wir wissen auch was er bedeuet.....nur werden wir aus solch oberflächlichen Anfaben nicht wirklich schlau.
Zuletzt geändert von Anonymous am Sonntag 29. Mai 2016, 11:49, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir fehlen da noch ein paar Informationen um das abschliessend beurteilen zu koennen. Wo stehen die beiden Rechner, wenn es *nicht* geht. Sind die hinter einem Router, zuhause?

Unter der Annahme das dem so ist, ist die Antwort simpel: man kann von aussen nicht einfach in dein Heimnetzwerk reinlangen, und dort einen Rechner verbinden. Dazu ist wie du schon sagst Portforwarding notwendig, oder andere Techniken (Hole Punching, zentraler Server).

Ein Spiel das dich eine Session hosten laesst, muss auch eine von diesen Techniken verwenden. Sonst ist essig.
BlackJack

@Chugy: Bei TCP hat das übrigens nicht perfekt funktioniert, sondern zufällig. Weder garantiert `send()` das alles gesendet wurd, noch `recv()` dass alle was zu einer Nachricht gehört auch gelesen wurde. `send()` gibt zurück wieviele Bytes tatsächlich gesendet wurden. Sollte die Zahl kleiner als die Bytes beim Aufruf sein, müsste man solange `send()` mit den verbliebenden Daten aufrufen bis tatsächlich alles raus ist. Oder man verwendet `sendall()`. Beim `recv()` wird es noch ein bisschen komplizierter, denn das muss man solange aufrufen bis man eine komplette Nachricht zusammen hat. Dazu muss man das aber irgendwie erkennen können. Beispielsweise in dem man vorher die Länge der Nachricht übermittelt, und dann entsprechend viele Bytes liest, oder in dem man die Nachricht mit einem Marker abschliesst, der *in* der Nachricht garantiert nicht vorkommen kann (oder dort geeignet ”escaped” wird).

Etwas einfacher kann man es sich machen wenn man sich mit der `makefile()`-Methode vom Socket-Objekt ein Dateiobjekt geben lässt. Da kann man dann `read()` und `write()` aufrufen mit der Semantik die Dateiobjekte in Python haben, oder auch mit der `next()`-Funktion die nächste Zeile aus dem Datenstrom bekommen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chugy: wenn Dein Rechner hinter einem Router läuft, muß der Serverport per Portforwarding freigegeben werden und zusätzlich muß beim Client Deine externe IP-Addresse verwendet werden.
Chugy
User
Beiträge: 7
Registriert: Sonntag 1. März 2015, 15:14

Hey Leute, danke für die Antworten.

1.) Nein der Computer steckt nicht hinter meinem Router.
2.) Wollt ihr mir damit jetzt weiß machen, dass so ziemlich alle Multiplayer die ich quasie "selbst """" HOSTE """" über einen Server Script laufen?

Ich weiß nicht recht wie ich es euch erklären soll, aber mein Gehirn hat da ein ganz klares und großes Verständniss Problem.
Ein Multiplayer der Single als auch Multiplayer besitzt, kann Daten hin und her schicken. VON PC ZU PC (nicht in ein und dem selben Netzwerk) ?
Das ist doch dann garnicht machbar ohne eine Verbindung zu einem externen Server oder ? :O
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt nur so viele Moeglichkeiten. Entweder zwei Rechner haben oeffentliche IPs. Dann koennen die direkt miteinander reden. Oder sie haben die nicht. Dann muessen sie mindestens zur Anbahnung ueber einen Mittelsmann/server gehen. Ggf. kann man - mit viel Ahnung von Netzwerkprogrammierung - dann direkt miteinander reden, weil man sich bestimmte Firewall-Eigenheiten zu Nutze macht - Stichwort Hole Punching.

Inwiefern das, was du als hosten empfindest wirklich hosten *ist*, also auf deinem Rechner wirklich zB eine MineCraft Welt rechnet, oder ob das nur das einstellen von Parametern ist, und es ist immer ein Server dahinter, kann man so ohne konkretes Spiel fuer das man das wissen will nicht sagen.

Hat fuer die Kommunikation aber auch wenig zu sagen. Denn ohne zentralen Server mindestens mal zur Anbahnung, also als Vermittlungsstelle, geht es eh nicht. Du kannst ja schlecht 4 Milliarden IPs abgrasen in der Hoffnung jemanden zu finden, der das gleiche spielt wie du...
Chugy
User
Beiträge: 7
Registriert: Sonntag 1. März 2015, 15:14

Ah ok. Sehr schön erklärt.
Also ist ein "weiterleidender" Zwischenabschnitt (Server) notwendig um eine Problemlose Verbindung aufzubauen.
Sollte ich hinbekommen.

Ich versuche einfach, die Daten die an den Server geschickt werden, an den anderen Partner weiterzuleiten. Hat den gleichen direkten "Sinn" und ja.
Mal sehen. :)=

Aber danke für deine Hilfe. Aber das gute an der Sache ist, ich habe schonmal nichts falsch gemacht.^^ Guter Anfang für den Anfang.
Antworten