2012-03-19 50 views
2

我目前正在尝试通过关于网络的基本教程,我注意到一个基本的客户端/服务器程序将冻结在服务器试图从客户端读取更多数据时,所有的数据是收到。基本上,代码如下所示:在recv方法python TCP套接字块

def recv_all(sock,length): 
    data='' 
    while len(data)<length: 
     more=sock.recv(length-len(data)) 
     if not more : 
      raise EOFError('socket inchis %d octeti intr-un mesaj de %d octeti'%(len(data),length)) 
     data+=more 
    return data 

该函数从客户端和服务器都被调用,但服务器将首先使用它来处理客户端请求。一切正常,直到第二次调用sock.recv时,收到请求消息。

而不是跳到下一行(更多为0)调试器只是冻结在那里,我不知道这可能是什么原因。

我的操作系统是Windows XP,如果这是相关的任何方式。任何帮助,将不胜感激, 谢谢

+1

套接字是否非阻塞? – 2012-03-19 12:55:27

+2

这就是套接字的工作方式,它们默认是阻塞的。您可以使用'select'来检查是否有数据在套接字中读取,或使用非阻塞IO。 – cha0site 2012-03-19 13:02:41

+1

所以当我调用recv(1024)时,实际上发生了什么,并且正好有1024个字节需要读取?有没有办法知道是否有更多的数据? – 2012-03-19 13:38:27

回答

3

正如其他人指出的,原因是套接字默认阻塞的事实。这意味着recv函数将阻止程序的执行,直到某些数据到达。除非事情发生变化,否则程序将永远等待,或者直到服务器断开连接。

一个解决方案是使用settimeout函数切换到非阻塞套接字,如sock.settimeout(2)。这意味着如果在2秒内没有收到任何东西,则会抛出异常。您可以捕获该异常并相应地处理它。