Python socket.error: [Errno 111] Verbinding geweigerd

Ik probeer een programma te schrijven voor bestandsoverdracht met behulp van sockets. Het serveruiteinde van de code werkt prima. Aan de clientzijde krijg ik echter de volgende foutmelding

Traceback (most recent call last):
File "client.py", line 54, in <module>
uploadFiles(directory)
File "client.py", line 36, in uploadFiles
transferFile(fname)
File "client.py", line 13, in transferFile     
cs.connect((HOST, 36258))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

Mijn code is als volgt

import os
import socket
def transferFile(fname):
   HOST = '127.0.0.1'
   CPORT = 36258
   MPORT = 36250
   FILE = fname
   cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   cs.connect((HOST, 36258))
   cs.send("SEND " + FILE)
   cs.close()
   ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   ms.connect((HOST, MPORT))
   f = open(FILE, "rb")
   data = f.read()
   f.close()
   ms.send(data)
   ms.close()
def uploadFiles(directory):
   home = os.getenv("HOME")
   folder = str(home + "/" + directory)
   os.chdir(folder)
   dirList = os.listdir(folder)
   print dirList
   for fname in dirList:
       if fname.endswith('.bin'):
           transferFile(fname)
os.chdir(os.getenv("HOME"))
directory = "testdownload"
if not os.path.exists(directory):
   os.makedirs(directory)
 os.chdir(directory)
uploadFiles(directory)

Ik heb geprobeerd hulp te zoeken op Google en andere berichten op Stack Overflow, maar geen van alle hielp. Kan iemand me alsjeblieft helpen?
De regelnummers kunnen verschillen, omdat ik slechts een deel van de code heb geplakt


Antwoord 1, autoriteit 100%

Het probleem was duidelijk (zoals je doorhad) dat poort 36250 niet open was aan de serverkant op het moment dat je verbinding probeerde te maken (vandaar dat de verbinding werd geweigerd). Ik kan zien dat de server deze socket moest openen na ontvangst van de opdracht sendop een andere verbinding, maar blijkbaar “opende [it] niet synchroon met de clientzijde”.

Nou, de belangrijkste reden zou zijn dat er helemaal geen synchronisatie was. Bellen:

cs.send("SEND " + FILE)
cs.close()

zou de gegevens gewoon in een OS-buffer plaatsen; closezou waarschijnlijk de gegevens wegspoelen en het netwerk binnendringen, maar het zou vrijwel zeker terugkeren voordat de gegevens de server zouden bereiken. Het toevoegen van sleepna closezou het probleem kunnen verhelpen, maar dit is geen synchronisatie.

De juiste oplossing zou zijn om ervoor te zorgendat de server de verbinding heeft geopend. Hiervoor moet de server u een bericht terugsturen (bijvoorbeeld OK, of beter PORT 36250om aan te geven waar u verbinding moet maken). Dit zou ervoor zorgen dat de server al luistert.

Het andere is je moet de retourwaarden van sendcontroleren om er zeker van te zijn hoeveel bytes er uit je buffer zijn gehaald. Of gebruik sendall.

(Sorry voor het verontrusten met dit late antwoord, maar ik vond dit een vraag met veel verkeer en ik vond het slaapidee in het opmerkingengedeelte niet echt leuk.)

Other episodes