2013-04-29 57 views
1

好的,在一些插槽和網絡實驗中,我已經建立了一個非常基本的聊天客戶端/服務器,可以在Unix上無縫運行。現在我在翻譯win32時遇到了一些錯誤。在前言中,我明白Windows上的select.select()不會接受套接字對象,並且(我認爲)通過不傳遞套接字對象而是套接字號來補償連貫性。然而,腳本仍然掛在select.select()函數上,我不知道爲什麼。該腳本只會掛起,直到服務器收到一條消息,之後它允許客戶端發送消息,但無論如何,客戶端都無法從服務器接收消息。我試圖儘可能地排除這兩個錯誤,但是我的研究已經變得乾燥起來。這裏是問題代碼,預先感謝。Windows上select.select()的問題

while True: 
    socket_list.append(s) 
    read_sockets, write_sockets, error_sockets = select.select(socket_list, [], [], 20) 
    if not (read_sockets or write_sockets or error_sockets): 
     if afk == False: 
      s.send('[Status]: '+str(_user)+' has gone afk.\n') 
      sys.stdout.write('\n[+]: You have gone afk.\n') 
      afk = True 
      prompt() 
    for sock in read_sockets: 
     print ('Starting for sock in read_sockets') #DEBUG# 
     if sock == s: 
      print ('Getting here.') #DEBUG# 
      data = sock.recv(4096) 
      if not data: 
       sys.stdout.write('[!]: Disconnected from chat server by server.\n'+W) 
       choice = raw_input('[*]: Press Enter to continue.') 
       _logic() 
      else: 
       sys.stdout.write(data) 
     else: 
      # Rest of the Program (Runs correctly) # 
+0

你見過http://twistedmatrix.com/嗎? – 2013-08-30 01:05:27

回答

1

這聽起來像你忘記設置套接字非阻塞。像幾乎所有狀態報告功能一樣,select不作未來保證。您還需要處理read返回「will block」指示的情況。你不能依靠select來預測未來read操作的結果。

+0

在Unix版本中,沒有必要將套接字設置爲非阻塞,所以我不一定認爲這是問題。無論我設置s.setblocking(0)還是不要將腳本掛在同一個位置。 – skipper587 2013-04-30 19:27:13

+0

有必要設置套接字非阻塞。如果你不這樣做,你可以阻止。你現在是否說過,即使你設置了非阻塞套接字,它們仍然阻止了對'recv'的調用?這將是非常驚人的。 – 2013-05-01 08:17:44