IP und Port abfragen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Montag 17. Juli 2017, 22:36

Ich frage mal nach: Ich habe eine IP und einen Port, beides existiert. Da ackert ein Gameserver, der auf eine Anfrage hin (eine API dazu gibt es leider nicht) eine Antwort liefert. Ich habe im Netz Quellcode gefunden, um eine Verbindung zu einer IP und einem Port herzustellen und dann von dort die Antwort zu erfassen. Das Skript liest sich für mich ganz einfach (?).

Code: Alles auswählen

import socket


HOST = '68.233.250.104'   
PORT = 27910


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("68.233.250.104", 27910))
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()))

finally:
    s.close()
Problematisch ist, dass es eine Fehlermeldung gibt:

Code: Alles auswählen

    s.bind(("68.233.250.104", 27910))
OSError: [WinError 10049] Die angeforderte Adresse ist in diesem Kontext ungültig
Kann mir jemand einen Tipp geben, was noch falsch läuft? (Ich habe keine Erfahrung mit Netzwerkprogrammierung usw.)
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Montag 17. Juli 2017, 22:52

BTW: Ich erhalte folgende Fehlermeldung:

Code: Alles auswählen

ConnectionRefusedError: [WinError 10061] Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte
Kann mir jemand erklären, wie der Fehler zustande kommen und behoben werden könnte?
BlackJack

Montag 17. Juli 2017, 23:04

@pixewakb: Du hast da Code für einen *Server* der versucht über die Schnittstelle mit der IP 68.233.250.104 auf Port 27910 auf Anfragen zu warten. Was nur geht wenn der Rechner tatsächlich eine Schnittstelle mit dieser IP besitzt.
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Montag 17. Juli 2017, 23:26

Gibst Du mir einen Tipp, nach welchem Modul bzw. welchem Stichwort ich suchen muss? Ich habe es bislang mit "Python Port IP fetch data" (und andere vergleichbare Suchwörter) versucht und nicht viel anderes gefunden...
BlackJack

Montag 17. Juli 2017, 23:41

@pixewakb: In der Python-Dokumentation gibt es etwas bei den HOWTOS.
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Dienstag 18. Juli 2017, 10:29

Kannst Du mir mal einen Tipp geben, wonach ich da suchen muss und was genau falsch läuft? Ich stehe etwas auf dem Schlauch. :K

Konkret: Ist socket das richtige Modul und falls ja, muss ich zum Verbindungsaufbau eine andere Funktion verwenden? Gibt es etwas, wonach ich suchen muss? Das, was ich finde, greift scheinbar immer auf localhost zu...
Benutzeravatar
kbr
User
Beiträge: 895
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dienstag 18. Juli 2017, 11:44

pixewakb hat geschrieben:Konkret: Ist socket das richtige Modul
Ja, ist es. Sockets werden zu Kommunikation sowohl vom Client als auch vom Server genutzt. Die Implementierung fällt aber je nach Fall unterschiedlich aus. Dein Code versucht einen Server aufzusetzen, keinen Client. Du brauchst aber einen Client, um auf den Gameserver zuzugreifen.
Wie BlackJack schon bemerkte: in der Doku findest Du unter HOWTOs einen Artikel dazu.
__deets__
User
Beiträge: 3111
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 18. Juli 2017, 11:45

BlackJack hat's schon erwaehnt: dein Code ist ein SERVER. Du hast aber schon einen Server, und willst einen CLIENT schreiben. Das aendert fundamental die Aufrufe auf einem Socket. Statt bind braucht man connect, und das accept faellt weg (man hat ja nur eine und nicht mehrere Verbindungen).

Und dazu findet sich auch jede Menge Beispielcode, uA in der Standarddoku.
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Dienstag 18. Juli 2017, 11:55

Ich hatte noch nie mit Netzwerkprogrammierung zu tun. Ich mache das gerade auch nur, weil ich an Daten heran will, die dort liegen. Die Antworten machen es etwas transparenter. Ich schaue es mir gleich noch mal an. DANKE!
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Dienstag 18. Juli 2017, 22:48

Ich habe mal im Netz gesucht und dann hier das versucht:

Code: Alles auswählen

import socket

sock = socket.socket()

server_address = ('87.230.23.141', 22222)
sock.connect(server_address)

sock.close()
Ich habe eine Liste mit IPs und Ports und erhalte entweder TimeOut-Meldungen oder ConnectionRefusedError-Meldungen. Grob gefragt: Wäre der Quellcode im Prinzip in Ordnung (u. d. h. die IP antwortet nicht, warum auch immer) oder mache ich noch was falsch.
BlackJack

Mittwoch 19. Juli 2017, 09:43

@pixewakb: Das wäre im Prinzip der Code um sich mit Port 22222 der IP 87.230.23.141 zu verbinden. Das ist ein Server von Hosteurope und der lehnt für mich den Verbindungsversuch ab.
Benutzeravatar
pixewakb
User
Beiträge: 1031
Registriert: Sonntag 24. April 2011, 19:43

Mittwoch 19. Juli 2017, 12:56

Ich habe eine Liste mit Servern (IP + Port), die Daten bereithalten, die ich abarbeiten wollte. Ich konnte bei keinem der Server, die sonst ansprechbar sind, eine Verbindung aufbauen. Ich habe das letzte Skript verwendet. Zum Verständnis: Mache ich da etwas falsch, müsste ich mehr mitschicken, mich vorher irgendwie anmelden oder wie könnte so etwas erklärbar sein? (Danke im Voraus!)
BlackJack

Mittwoch 19. Juli 2017, 13:20

@pixewakb: Ich würde bei so etwas ja als erstes Versuchen mit ``telnet`` oder Netcat eine Verbindung aufzubauen. Wenn das nicht funktioniert, dann braucht man es mit Python gar nicht erst zu versuchen, denn dann stimmt etwas anderes nicht.
Antworten