Waarom krijg ik de foutmelding “verbinding geweigerd” in Python? (Sockets)

Ik ben nieuw bij Sockets, excuseer me voor mijn volledige gebrek aan begrip.

Ik heb een serverscript(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()

en clientscript (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

Ik ga naar mijn desktopterminal en start het script door te typen:

python server.py

waarna ik naar mijn laptopterminal ga en het clientscript start:

python client.py

maar ik krijg de volgende foutmelding:

Bestand “client.py”, regel 9, in

s.connect((host,poort))

Bestand “/usr/lib/python2.7/socket.py”, regel 224, in meth

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

socket.error: [Errno 111] Verbinding geweigerd

Ik heb geprobeerd verschillende poortnummers te gebruiken zonder resultaat. Ik kon de hostnaam echter krijgen met dezelfde ip en de methode gethostname() in het clientscript en ik kan de desktop (server) pingen.


Antwoord 1, autoriteit 100%

In plaats van

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

je zou het moeten proberen

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

zodat de luisteraansluiting niet te beperkt is. Misschien gebeurt het luisteren anders maar op één interface die op zijn beurt niet gerelateerd is aan het lokale netwerk.

Een voorbeeld zou kunnen zijn dat het alleen luistert naar 127.0.0.1, waardoor verbinding maken vanaf een andere host onmogelijk is.


Antwoord 2, autoriteit 14%

Deze fout betekent dat de client om welke reden dan ook geen verbinding kan maken met de poort op de computer waarop het serverscript wordt uitgevoerd. Dit kan worden veroorzaakt door een paar dingen, zoals een gebrek aan routering naar de bestemming, maar aangezien u de server kunt pingen, zou dit niet het geval moeten zijn. De andere reden kan zijn dat je ergens tussen je client en de server een firewall hebt – het kan op de server zelf of op de client zijn. Gezien uw netwerkadressering, neem ik aan dat zowel de server als de client zich op hetzelfde LAN bevinden, dus er mag geen router/firewall bij betrokken zijn die het verkeer zou kunnen blokkeren. In dit geval zou ik het volgende proberen:

  • controleer of die poort echt luistert op de server (dit zou je moeten vertellen of je code doet wat je denkt dat het zou moeten): gebaseerd op je besturingssysteem, maar op linux zou je zoiets kunnen doen als netstat -ntulp
  • controleer vanaf de server of u de verbindingen met de server accepteert: opnieuw op basis van uw besturingssysteem, maar telnet LISTENING_IP LISTENING_PORTzou het werk moeten doen
  • controleer of je vanaf de client toegang hebt tot de poort van de server, maar niet de code gebruikt: gebruik gewoon het telnet (of de juiste opdracht voor je besturingssysteem) van de client

en laat ons dan de bevindingen weten.


Antwoord 3, autoriteit 3%

Stel s = socket.socket()
De server kan op de volgende manieren worden gebonden:
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))

Als u niet exact dezelfde methode gebruikt aan de clientzijde, krijgt u de foutmelding: socket.error errno 111 connection refused.

Dus je moet aan de clientzijde precies dezelfde methode gebruiken om de host te krijgen, als op de server. In het geval van een klant gebruikt u bijvoorbeeld de volgende 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))

Ik hoop dat dit het probleem oplost.


Antwoord 4

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

Ik denk dat deze fout te maken heeft met de DNS-resolutie.
Deze zin host = socket.gethostname()krijgt de hostnaam, maar als het besturingssysteem de hostnaam niet kan omzetten naar een lokaal adres, krijgt u de foutmelding.
Linux-besturingssysteem kan het bestand /etc/hostswijzigen, er één regel aan toevoegen. Het ziet er als volgt uit (‘hostname’ is welke socket.gethostname()kreeg).

127.0.0.1   hostname

Antwoord 5

Let op om het poortnummer te wijzigen. Soms hoeft u alleen het poortnummer te wijzigen. Ik heb dat ervaren toen ik wijzigingen aanbracht in plaats van wijzigingen in syntaxis en functies.


Antwoord 6

maak in uw server.py-bestand : host ='192.168.1.94'in plaats van host = socket.gethostname()


Antwoord 7

Ik kon mijn verbinding pingen, maar kreeg NOG STEEDS de foutmelding ‘verbinding geweigerd’. Blijkt dat ik mezelf aan het pingen was! Dat was het probleem.


Antwoord 8

Ik kreeg hetzelfde probleem in mijn code, en na een paar dagen zoeken heb ik eindelijk de oplossing gevonden, en het probleem is dat de functie socket.gethostbyname(socket.gethostname) niet werkt in linux, dus in plaats daarvan moet je gebruik socket.gethostbyname(‘zet de hostnaam handmatig in’) niet socket.gethostbyname(‘localhost’), gebruik socket.gethostbyname(‘host’) kijkend met ifconfig.


Antwoord 9

probeer dit commando in terminal:

sudo ufw enable
ufw allow 12397

Other episodes