webentwicklung-frage-antwort-db.com.de

Warum erhalte ich die Fehlermeldung "Verbindung abgelehnt" in Python? (Steckdosen)

Ich bin neu bei Sockets. Bitte entschuldigen Sie mein völliges Unverständnis. 

Ich habe ein Serverskript (server.py): 

#!/usr/bin/python

import socket #import the socket module

s = socket.socket() #Create a socket object
Host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) #Bind to the port

s.listen(5) #Wait for the client connection
while True:
    c,addr = s.accept() #Establish a connection with the client
    print "Got connection from", addr
    c.send("Thank you for connecting!")
    c.close()

und Client-Skript (client.py): 

#!/usr/bin/python 

import socket #import socket module

s = socket.socket() #create a socket object
Host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service

s.connect((Host,port))
print s.recv(1024)
s.close

Ich gehe zu meinem Desktop-Terminal und starte das Skript durch Eingabe von: 

python server.py

danach gehe ich zu meinem Laptop-Terminal und starte das Client-Skript: 

python client.py

ich erhalte jedoch die folgende Fehlermeldung: 

Datei "client.py", Zeile 9, in 

s.connect ((Host, Port)) 

Datei "/usr/lib/python2.7/socket.py", Zeile 224, in meth

return getattr (self._sock, name) (* args)

socket.error: [Errno 111] Verbindung abgelehnt

Ich habe versucht, verschiedene Portnummern ohne Erfolg zu verwenden. Ich konnte jedoch den Hostnamen über dieselbe IP und die gethostname () - Methode im Clientskript abrufen und den Desktop (Server) anpingen. 

48
Sheldon

Anstatt 

Host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) #Bind to the port

du solltest es versuchen

port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port

damit die Abhörbuchse nicht zu stark eingeschränkt ist. Ansonsten erfolgt das Abhören möglicherweise nur an einer Schnittstelle, die wiederum nicht mit dem lokalen Netzwerk zusammenhängt.

Ein Beispiel könnte sein, dass nur 127.0.0.1 abgehört wird, was die Verbindung von einem anderen Host aus unmöglich macht.

65
glglgl

Dieser Fehler bedeutet, dass der Client aus irgendeinem Grund keine Verbindung zum Port des Computers herstellen kann, auf dem das Serverskript ausgeführt wird. Dies kann durch wenige Dinge verursacht werden, z. B. mangelndes Routing zum Ziel. Da Sie jedoch den Server anpingen können, sollte dies nicht der Fall sein. Der andere Grund könnte sein, dass sich irgendwo zwischen Ihrem Client und dem Server eine Firewall befindet - diese kann auf dem Server selbst oder auf dem Client sein. Bei Ihrer Netzwerkadressierung gehe ich davon aus, dass sich Server und Client im selben LAN befinden. Daher sollte kein Router beteiligt sein, der den Verkehr blockieren könnte. In diesem Fall würde ich Folgendes versuchen:

  • Überprüfen Sie, ob Sie wirklich diesen Port auf dem Server abhören (dies sollte Ihnen sagen, ob Ihr Code das tut, was Sie Ihrer Meinung nach tun sollten): je nach Betriebssystem, aber unter Linux könnten Sie etwas wie netstat -ntulp tun
  • Überprüfen Sie vom Server aus, ob Sie die Verbindungen zum Server akzeptieren: Wieder abhängig von Ihrem Betriebssystem, aber telnet LISTENING_IP LISTENING_PORT sollte die Aufgabe ausführen
  • prüfen Sie, ob Sie vom Client aus auf den Port des Servers zugreifen können, den Code jedoch nicht verwenden: Verwenden Sie einfach das Telnet (oder den entsprechenden Befehl für Ihr Betriebssystem) vom Client aus

und lassen Sie uns dann die Ergebnisse wissen.

7
SpankMe

versuchen Sie diesen Befehl im Terminal:

Sudo ufw enable
ufw allow 12397
1
mou ayad
Host = socket.gethostname()  # Get the local machine name
port = 12397                 # Reserve a port for your service
s.bind((Host,port))          # Bind to the port

Ich denke, dieser Fehler könnte sich auf die DNS-Auflösung beziehen. Dieser Satz Host = socket.gethostname() ruft den Hostnamen ab, aber wenn das Betriebssystem den Hostnamen nicht in eine lokale Adresse auflösen kann, erhalten Sie den Fehler Ändern Sie die /etc/hosts-Datei und fügen Sie eine Zeile hinzu. Es sieht aus wie unten ('hostname' ist was socket.gethostname() bekommen hat).

127.0.0.1   hostname
1
aoniao

Angenommen, s = socket.socket () Der Server kann durch folgende Methoden gebunden werden: Methode 1:

Host = socket.gethostname()
s.bind((Host, port))

Methode 2:

Host = socket.gethostbyname("localhost")  #Note the extra letters "by"
s.bind((Host, port))

Methode 3:

Host = socket.gethostbyname("192.168.1.48")
s.bind((Host, port))

Wenn Sie dieselbe Methode auf der Clientseite nicht genau verwenden, wird der Fehler angezeigt: socket.error errno 111 connection refused.

Daher müssen Sie auf der Clientseite genau dieselbe Methode verwenden, um den Host zu erhalten, wie auf dem Server. Im Falle eines Mandanten verwenden Sie beispielsweise die folgenden Methoden:

Methode 1:

Host = socket.gethostname() 
s.connect((Host, port))

Methode 2:

Host = socket.gethostbyname("localhost") # Get local machine name
s.connect((Host, port))

Methode 3:

Host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((Host, port))

Hoffe das löst das Problem.

1
M Shiraz Baig

in Ihrer server.py-Datei machen Sie: Host ='192.168.1.94' statt Host = socket.gethostname()

0
Majd Saadaoui

Ich konnte meine Verbindung anpingen, bekam aber NOCH den Fehler "Verbindung abgelehnt". Es stellte sich heraus, dass ich selbst gepingelt habe! Das war das Problem.

0
Azizbro