2013-10-24 32 views
3

我正在使用python編寫一個簡單的TCP服務器,並試圖輸入超時。我當前的代碼:向python服務器添加超時時出現非阻塞錯誤

import socket 


def connect(): 
    HOST = ''     # Symbolic name meaning the local host 
    PORT = 5007    # Arbitrary non-privileged port 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST, PORT)) 
    s.listen(1) 
    s.settimeout(5) 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    return conn 

conn = connect() 

while 1: 
    data = conn.recv(1024) 
    if not data: break 
    print data 
conn.close() 

的問題是,當我嘗試連接我的數據= conn.recv(1024)

error: [Errno 10035] A non-blocking socket operation could not be completed immediately 

代碼工作沒有超時的得到一個錯誤。

+0

我真的推薦'SocketServer'模塊。它使我很容易切換到多線程等,它也被'SimpleHTTPServer'模塊使用。 – User

+1

你知道爲什麼引發異常嗎? – AmitE

回答

1

您可以打開阻塞:

# ... 
    conn.setblocking(1) 
    return conn 
# ... 
+2

這完全沒有解釋爲什麼設置超時會導致它變爲非阻塞。就我所能找到的而言,這當然不在python文檔中,我很好奇爲什麼會發生這種情況。 – Fulluphigh

+1

實際上設置一個超時會使其非阻塞。從文檔 - >「s.settimeout(0.0)相當於s.setblocking(0); s.settimeout(無)相當於s.setblocking(1)。」請參閱https://docs.python.org/2/library/socket.html#socket.socket.settimeout – AmitE

1

碰到了同樣的問題,29分鐘前。找到一個簡單的非優雅的工作......如果你通過執行time.sleep(1)來讓socket有時間呼吸,捕獲10035錯誤並重試它可以工作。我正在使用2.7.5 ...也許這是一個固定的錯誤。不確定。

代碼示例...請理解這是我使用的非常簡單的測試代碼(一次只能接收1個字節)。所以,'s'是10s超時的套接字,'numbytes'是字節數I需要...

def getbytes(s,numbytes): 
    din = '' 
    socketerror10035count = 0 
    while True: 
      try: 
       r = s.recv(1).encode('hex') 
       din += r 
       if len(din)/2 == numbytes: 
        print 'returning',len(din)/2, 'bytes' 
        break 
      except socket.timeout as e: 
       din = 'socket timeout' 
       break 
      except socket.error as e: 
       if e[0] == 10035 and socketerror10035count < 5: 
        socketerror10035count = socketerror10035count +1 
        time.sleep(1) 
       else: 
        din = 'socket error' 
        break 
      except: 
       din = 'deaddead' 
       break 
    return din 
1

嘗試設置套接字上的超時和連接上的阻塞。像這樣:

import socket 

def connect(): 
    HOST = ''     # Symbolic name meaning the local host 
    PORT = 5007    # Arbitrary non-privileged port 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.settimeout(5) 
    s.bind((HOST, PORT)) 
    s.listen(1) 
    return s 

s = connect() 

while 1: 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    conn.setblocking(1) 
    data = conn.recv(1024) 
    conn.close() 
    if not data: break 
    print data 
s.close() 
+1

它的工作原理,任何想法爲什麼添加超時將首先導致錯誤? – user3582887

+1

此外,此錯誤只發生在Windows中,當在Linux上運行時,不需要「conn.setblocking(1)」,並且超時按預期工作。 – user3582887