2013-07-14 109 views
0

我想實現一個TCP服務器,它不會在recv或sendall操作期間永遠掛起(潛在地)。實現一個非阻塞的TCP服務器

我認爲這將是足夠的指定活動的套接字超時,但是這似乎並沒有這樣的情況:see here

所以,我怎麼能延長我的代碼,以確保:

  • 的recv將不會在任何情況下掛斷
  • sendall在任何情況下將不會掛斷(好吧,我不知道如果sendall可以掛斷所有)

任何建議,非常感謝。

+0

看一看[扭曲](http://twistedmatrix.com/trac/) – User

回答

1

你需要的是select函數。 它需要3個參數;讀取列表,寫入列表,錯誤列表。 然後它返回三個值,每個值都是您輸入的套接字列表,這些套接字已準備好寫入,讀取。 (或者,如果你想檢查已出現錯誤。)

rl , wl , el = select([ serversocket , clientsocket ] , [] , []); 
for e in rl: 
    if e == serversocket: 
    acceptConnection(serversocket); 
    else: 
    readFromClient(clientsocket); 
+0

嗨!謝謝你的回答。這是否也照顧sendall不會掛斷?我不需要使活動套接字非阻塞? – Rickson

+0

你想進入'sendall'的非阻塞模式,但是在你下次寫入之前,一定要檢查你是否可以用'select'來寫入它。 – NullData

+0

您不需要使套接字非阻塞。選擇告訴zou是否有內容,然後開始讀取/寫入 – User