2013-04-29 90 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