2011-09-20 60 views
5

程序连接到服务器,然后在连接被服务器关闭时,如果我尝试重新连接它说:socket.error: [Errno 9] Bad file descriptor
如果我关闭套接字在客户端,然后我尝试重新连接时,它说:socket.error: [Errno 106] Transport endpoint is already connected如何在损坏的管道后重新连接插座?


有没有办法破管后重新连接,而无需创建一个新的socket?

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

回答

9

假设这是一个面向连接的插座:

号你要关闭旧的和新创建一个socket,

+1

原因是套接字连接是在操作系统级别进行管理的(并且这适用于任何编程语言)。在Linux下,为连接分配一个文件描述符,连接关闭时将销毁该连接,因此您需要重新连接以创建新的文件描述符。 – EdwardGarson

1

如果文件描述符是坏的,那么你将需要释放该资源并创建一个新的套接字。这将为您提供一个新的文件描述符。

如果连接异常终止,则必须等待服务器关闭连接,然后才能重新连接。我会频繁地进行轮询(但不是太频繁)以查看是否可以重新建立与新套接字的连接。

你多久会得到坏管道错误?

+0

当我关闭服务器中的连接时出现错误。什么即时通讯想知道是否有一种方法来重新使用相同的套接字服务器。 –