2011-09-20 85 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

當我關閉服務器中的連接時出現錯誤。什麼即時通訊想知道是否有一種方法來重新使用相同的套接字服務器。 –