socket.erreur: [Errno 111] lors de la connexion à un socket
J'étais en train d'écrire un code où un client se connecte au serveur sur un numéro de port par défaut, le serveur envoie ensuite un autre numéro de port pour le client. Le client se connecte maintenant à le nouveau numéro de port.
Client:
import socket
import sys
import os
import signal
import time
s = socket.socket()
s.connect(("127.0.0.1", 6667))
line = s.recv(1024)
if line.strip():
port = int(line)
s.close()
soc = socket.socket()
soc.connect(("127.0.0.1", port))
print soc.recv(1024)
soc.close()
else:
s.close()
Serveur:
import socket
import sys
import os
import signal
import time
port = 7777
s = socket.socket()
s.bind(("127.0.0.1", 6667))
s.listen(0)
sc, address = s.accept()
print address
sc.send(str(port))
sc.close()
s.close()
sock = socket.socket()
sock.bind(("127.0.0.1", port))
soc, addr = sock.accept()
print addr
soc.send("Success")
soc.close()
sock.close()
Lorsque j'exécute ce code, j'obtiens des erreurs suivantes sur les côtés client et serveur.
Serveur:
('127.0.0.1', 36282)
Traceback (most recent call last):
File "server.py", line 17, in <module>
soc, addr = sock.accept()
File "/usr/lib/python2.7/socket.py", line 202, in accept
sock, addr = self._sock.accept()
socket.error: [Errno 22] Invalid argument
Client:
Traceback (most recent call last):
File "client.py", line 13, in <module>
soc.connect(("127.0.0.1", port))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
Quelqu'un peut-il m'expliquer la raison de ces erreurs et de fournir une solution pour ces erreurs.
Vous semblent manquer
^ le travail pour moi. Regardez aussi pour vos noms de variable...
Pourquoi ne pas faire un aswer?
Michael Petch: Merci ça a fonctionné. Je suis nouveau sur le socket de programmation, ce qui a aidé.
sock.listen(0)
suite à votre appel à sock.bind(("127.0.0.1", port))
. Également prendre en compte ce qui se passerait si votre client est envoyé à un numéro de port (et tente de se connecter) avant que le serveur démarre à l'écoute pour les connexions.^ le travail pour moi. Regardez aussi pour vos noms de variable...
s
, sc
, sock
... surtout si vous allez poster ici.Pourquoi ne pas faire un aswer?
Michael Petch: Merci ça a fonctionné. Je suis nouveau sur le socket de programmation, ce qui a aidé.
OriginalL'auteur dynamo | 2014-10-25
Vous devez vous connecter pour publier un commentaire.
Avant vous pouvez
listen
à un TCP/IP socket (une connexion basée streaming socket), vous devez utiliserbind
pour attribuer un socket (créé avecsocket.socket()
) . Ensuite, vous devez fairelisten
de la préparer pour les connexions entrantes et puis, finalement, vous neaccept
sur la socket.Vous semblent manquer
sock.listen(0)
suite à votre appel àsock.bind(("127.0.0.1", port))
. Le La documentation Python est court sur les détails, mais il ne dit ceci à propos de TCP/IP:Python les bases de son support de module sur un Berkeley Socket modèle. Vous pouvez trouver des informations plus détaillées sur les Sockets Berkeley à ce lien . En particulier, il dit ceci à propos de
bind
:Également prendre en compte ce qui se passerait si votre client est envoyé à un numéro de port (et tente de se connecter) avant que le serveur démarre à l'écoute pour les connexions (sur le port 7777 dans ce cas). Bien que n'étant pas la cause de vos problèmes, je voulais souligner le scénario de l'exhaustivité. Quelque chose que vous pouvez envisager de ne pas fermer le port 6667 support jusqu'à ce que après avoir appelé
listen
sur le port 7777 socket. Après l'appel delisten
vous pouvez ensuite fermer la première prise. Sur le client après la lecture de ce port, vous pouvez attendre jusqu'à la première connexion (port 6667) est fermée par le serveur et se connecter au port 7777.OriginalL'auteur Michael Petch