2014-10-25 4 views
3

Я пытался написать код, где клиент подключается к серверу по номеру порта по умолчанию, затем сервер отправляет клиенту другой номер порта. Теперь клиент подключается к новому номеру порта.socket.error: [Errno 111] при попытке подключения к сокету

Клиент:

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() 

Сервер:

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() 

Когда я выполняю этот код, я получаю следующие ошибки на стороне клиента и на стороне сервера.

Сервер:

('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 

Клиент:

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 

Может кто-нибудь объяснить мне причину этих ошибок и обеспечить решение этих ошибок.

+2

Похоже, вам не хватает 'sock.listen (0)' после вашего звонка на 'sock.bind ((« 127.0.0.1 », порт)). Также подумайте, что произойдет, если ваш клиент отправит номер порта (и попытается подключиться), прежде чем сервер начнет прослушивать подключения. –

+0

^работа для меня. Смотрите также ваши имена переменных ... 's',' sc', 'sock' ... особенно если вы разместите его здесь. – wenzul

+0

@MichaelPetch: Почему бы не сделать это aswer? – alk

ответ

1

Перед тем, как можно listen к TCP/IP сокет (соединение на основе потокового сокета), необходимо использовать bind назначить сокет (созданный с socket.socket()). Затем вам нужно сделать listen, чтобы подготовить его к входящим подключениям, а затем, наконец, вы получите accept на подготовленном сокете.

Возможно, вам не хватает sock.listen(0) после вашего звонка на sock.bind(("127.0.0.1", port)). Python documentation короток на деталях, но это не сказать о TCP/IP:

Note that a server must perform the sequence socket(), bind(), listen(), accept() (possibly repeating the accept() to service more than one client), while a client only needs the sequence socket(), connect(). Also note that the server does not sendall()/recv() on the socket it is listening on but on the new socket returned by accept().

Python основывает модуль сокетов на модели Berkeley Socket. Вы можете найти более подробную информацию о Berkeley Sockets на этом link. В частности, он говорит, что это о bind:

bind() assigns a socket to an address. When a socket is created using socket(), it is only given a protocol family, but not assigned an address. This association with an address must be performed with the bind() system call before the socket can accept connections to other hosts.

Также рассмотреть, что произойдет, если ваш клиент отправляется номер порта (и пытается подключиться) до того, как сервер начинает прослушивание подключений (на порт 7777 в данном случае). Хотя это и не причина ваших проблем, я хотел бы указать на сценарий полноты. Что-то, что вы можете подумать, не закрывает гнездо порта 6667 до тех пор, пока вы не назовете listen на разъем порта 7777. После вызова listen вы можете закрыть первый сокет. На клиенте после прочтения порта вы можете дождаться, пока первое соединение (порт 6667) не будет закрыто сервером, а затем подключится к порту 7777.

 Смежные вопросы

  • Нет связанных вопросов^_^