Как я могу восстановить розетку после сломанной трубы? - PullRequest
6 голосов
/ 20 сентября 2011

Программа подключается к серверу, и когда сервер закрывает соединение, если я пытаюсь восстановить соединение, он говорит: socket.error: [Errno 9] Bad file descriptor
Если я закрываю сокет в клиенте и затем пытаюсь восстановить соединение, он говорит: socket.error: [Errno 106] Transport endpoint is already connected.


Есть ли способ восстановить его после разрыва трубы без создания нового сокета?

import socket
host = '127.0.0.1'
port = 1337
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def loop():
    try:
        while 1:
            print s.recv(512)
    except socket.error:
        #s.close()?
        connect()
def connect():
    s.connect((host, port))
    loop()
connect()

Ответы [ 2 ]

12 голосов
/ 20 сентября 2011

Предполагается, что это сокет, ориентированный на соединение:

Нет.Вы должны закрыть старый и создать новый сокет,

2 голосов
/ 20 сентября 2011

Если файловый дескриптор плохой, вам нужно освободить этот ресурс и создать новый сокет.Это даст вам новый дескриптор файла.

Если соединение прервано ненормально, вам придется подождать, пока сервер закроет свой конец соединения, прежде чем вы сможете восстановить соединение.Я бы просто опрашивал его часто (но не слишком часто), чтобы посмотреть, сможете ли вы восстановить соединение с вашим новым сокетом.

Как часто вы получаете ошибку плохого канала?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...