IP Adresse nicht erreichbar !? Was tun ?

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

Hi Leute ich habe folgendes Problem. Ich will Server mit Client kommunizieren lassen.
Das Schema ist ganz einfach Server Script wird gestartet und wartet auf eingehende Verbindung des Clients.


Wenn Client verbindung aufbauen will so wird dieser aktzeptiert und kann nun kommunizieren. Man soll quasie eine Nachricht zwischen Client und Server schicken können und das immer abwechselnd.
Der Script den ich geschrieben habe der funktioniert soweit.....allerdings nur mit LOCALHOST.

Wenn ich meine IP anstatt "localhost" eingebe so kommt diese Fehlermeldung [ OSError: [WinError 10049] Die angeforderte Adresse ist in diesem Kontext ungültig ]. Nun wollte ich mich NATÜRLICH !!! kundig machen und habe den fehlercode bei Windows gefunden.
Er sagt mir das die IP nicht zugewiesen werden kann. Ja....aber was bedeutet das jetzt im Klartext. Mir mangelt es etwas am Verständnis was nun damit gemeint ist.

Hier sind meine beiden Test Scripts.

SERVER SCRIPT

Code: Alles auswählen

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("178.25.170.210", 4950))
s.listen(1)

try:
    while True:
        komm,addr = s.accept()
        while True:
            data = komm.recv(1024)

            if not data:
                komm.close()
                break
            
            print("[{}] {}". format(addr[0], data.decode()))
            nachricht = input("Antwort: ")
            komm.send(nachricht.encode())
finally:
    s.close()


# 178.25.170.210

UND CLIENT SCRIPT

Code: Alles auswählen

import socket

ip = input("Ip Adresse: ")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, 4950))

while True:
    if s.connect:
        print("Connected...")
    else:
        print("Verbindung fehlgeschlagen")
    


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

input()
Jetzt kommt das was mich eben verwundert. Wenn ich mit dem Client zugreifen will OHNE das der Serverscript aktiv ist kann der Client trotzdem was finden aber nicht connecten da keine Antwort kommt.

Bitte helpt mir ein wenig weiter ich stecke fest. Mit Localhost funktioniert es aber mit meiner IP nicht.
Den Port 4950 habe ich extra per Port triggering im Router unter TCP freigeschaltet und sollte denke ich mal dementsprechen funktionieren. Habe mein Router auch extra auf IPv4 umschalten lassen aber es funktioniert irgendwie nichts....

LG Chugy
Zuletzt geändert von Anonymous am Sonntag 1. März 2015, 15:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Chugy: Welche IP(s) hat denn der Rechner auf dem der Server läuft? Die IP die dort im Quelltext steht ist ja anscheinend eine öffentliche IP — ist das tatsächlich die IP des Rechners oder vielleicht doch eher die des Routers mit dem Du ins Internet gehst? In dem Fall würde der Client versuchen mit dem Router zu chatten, was natürlich nicht geht weil da nichts auf Port 4950 läuft was den Chat beantwortet.

Du musst im Server-Programm eine IP des Rechners auf dem er läuft verwenden und beim Router den Port zu dem Rechner auf dem das Server-Programm läuft weiterleiten.

Die beiden Programme sind übrigens fehlerhaft was das Senden und Empfangen angeht. TCP ist ein Datenstrom und sowohl `send()` muss nicht alles senden was man da übergeben hat — es kann auch sein das der Rechner erst einmal auf den Daten oder einem Teil der Daten sitzen bleibt und wartet ob noch mehr gesendet werden soll. Auf der anderen Seite bekommt man mit `recv()` mindestens ein Byte oder maximal so viele wie man als Argument übergeben hat. Man bekommt dort *nicht* garantiert das was auf der anderen Seite mit *einem* `send()` auf die Reise geschickt wurde. Wenn Du also eine ”Nachricht” aus dem Datenstrom lesen willst, dann musst Du im Extremfall damit rechnen das Du für jedes einzelne Byte der Nachricht `recv()` aufrufen musst. Was bedeutet, dass Du Code schreiben musst der erkennt wann eine Nachricht vollständig angekommen ist. Und sofern das Protokoll das Du da implementierst nicht Halbduplex ist, kann es sogar sein dass Du mit einem `recv()` auch schon einen Teil der nächsten Nachricht (oder sogar mehrere ganze Nachrichten) liest. Da muss man dann also noch ein bisschen mehr Programmieren um das alles sauber zu verarbeiten.

``if s.connect:`` ist unsinn. `connect` ist die Methode und Methoden sind als Wahrheitswert *immer* ”wahr”, das ``else`` kann dort also niemals betreten werden.
Chugy
User
Beiträge: 7
Registriert: Sonntag 1. März 2015, 15:14

Nunja ich habe was das Verbinden angeht noch ein paar Verständnis Probleme.
Die IP die ich im script verwende ist die, die ich aus dem Router nehme oder auch auf der Internetseite "wieistmeineip.de" finde.

Mein Ziel ist es einem Kumpel einen "Client script" zu schicken der mit meinem Pc kommunizieren kann. Sozusagen einen kleinen Chat für den Anfang.
Den Quelltext den ich hier hinein gestellt habe ist aus dem Buch was ich mir derzeit durchlese. Wollte testen ob ich soo mit meinem Computer verbinden kann. :/ aber das geht ja leider anscheinend nicht.
Ich bräuchte einen Script der einfach nur in "Verbindbar" :D. Ich bräuchte nur ein Beispiel dann würde ich es besser verstehen.

Also soll ich quasie eine "Port Weiterleitung" machen wo ich meine eigene IP angebe und dann einen port freischalten der für TCP funktioniert oder wie ?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chugy: socket.bind erwartet die Adresse des Netzwerkinterfaces, meist nimmt man 0.0.0.0 dann kann man von allen Interfaces Verbindungen aufbauen. Ob aber eine Verbindung von draußen bis zu Deinem Rechner durchgeleitet wird, ist eine ganz andere Frage.
Bei Büchern ist es leider so, dass, wenn es nicht gerade ein Buch ist, das sich auf Netzwerkprogrammierung spezialisiert hat, es zu 99% Schrott ist, was man da zu lesen bekommt.
Chugy
User
Beiträge: 7
Registriert: Sonntag 1. März 2015, 15:14

hmm :( Nunja.....es wird hier immer nur mit Localhost beschrieben aber wie man jetzt genau "ONLINE" geht steht da nicht drinne. Ich habe schon nach Netzwerkspezifischen Büchern geschaut aber keins gefunden. NUR EINS ! was aber für Python 2.5 ist und dementsprechend denke ich nicht mehr brauchbar ist....

na toll was kann ichn da jetzt am besten machen ? ich Interessiere mich extrems für solche Netzwerkprogrammierungen..... :/ ???
BlackJack

@Chugy: Wie man damit ”online” geht hat ja auch nicht so viel mit Python zu tun, denn das hängt vom Netzwerk ab, also wie das aufgebaut ist, wie der Router konfiguriert ist, und der oder die Rechner die da dran hängen.

Und was die Programmierung von Sockets angeht ist das auch nicht so wirklich pythonspezifisch. Da kann man im Grunde jeden Text nehmen der sich mit Socketprogrammierung mit der BSD-Socket-API beschäftigt. Das `socket`-Modul ist nur eine sehr dünne Schicht über die entsprechenden Aufrufe die man in C machen würde.

Eine Frage ist aber auch ob man sich überhaupt auf diesem niedrigen Niveau bewegen möchte, oder ob man nicht lieber irgendeinen RPC-Mechanismus verwendet, statt sich das alles selber schreiben zu müssen (XML-RPC, JSON-RPC, SOAP, …). Oder eine Messaging-Lösung wie RabbitMQ, ZeroMQ, …
Chugy
User
Beiträge: 7
Registriert: Sonntag 1. März 2015, 15:14

ja da hast du eig schon recht ABER.

Die Engine mit der ich arbeite die hat ein "Multiplyer Addon" und es funktioniert alles über Python und deswegen bin ich o fasziniert darüber das ich gleich alles wissen will. Aber es ist schwer an Quellen mit Wissen heran zu kommen. :(

ich will einfach nur wissen wie ein GRUND SCRIPT in Python aussieht womit ich per Internet mit Clienten mich verbinden kann bzw wodurch die Clienten untereinander kommunizieren können. Weißt du wie ich das meine ? :P
BlackJack

@Chugy: Selbst ein simpler Chat auf Socket-Ebene erfordert schon einiges an Code und Entwurfsentscheidungen. Und die haben dann jeweils wieder Einfluss darauf wie man den Code schreiben muss damit der robust und fehlerfrei läuft. Es gibt also nicht *das* Chatbeispiel sondern sehr viele Möglichkeiten so etwas zu implementieren.

Die BSD-Socket API ist von 1983! Da gibt es Tonnen an Informationen drüber im Netz und in Büchern. Leider auch viel schlechtes bei Quellen die das Thema nur mal so streifen, aber das man zu dem Thema nichts finden kann glaube ich nicht. Das meiste davon wird wie gesagt nicht speziell für Python sein, also muss man zumindest so viel C lesen/verstehen können um das Wissen zu übertragen.
Antworten