2014-10-10 49 views
0

我想为我的程序添加SSL支持。我在非阻塞套接字上使用了ssl.wrap_socket来创建一个SSLSocket。Python - SSLSocket.recv()只返回一个字节

现在我去从套接字读取...

try: 
    data = sslsock.recv(4096) 
except socket.error as e: 
    # error 
    ... 

为什么我只能收到一个字节?我知道有超过1个字节可用。

当我使用这个,而不是...

data = '' 
while 1: 
     try: 
      data += self.sock.recv(4096) 
     except socket.error as e: 
      if data: 
       break 
      else: 
       # error 
       ... 

字节的完整字符串返回。在使用wrap_socket之前,总是从recv调用中返回完整的字节串。

+0

注意:在select()调用返回之后,recv()从套接字开始并且它仍然只返回单个字节之前,我已尝试睡眠。这在使用python2.7的linux和Windows上都有发生。 – user202987 2014-10-10 16:23:00

回答

1

socket.recv实际上仅仅是其对应的recv(2)的包装。

的recv(2)手册页:

的接听电话正常返回的任何数据可用,直到 请求的数量,而不是等待接收请求全额 的。

+0

对,所以我想知道......为什么每次在SSLSocket上调用recv时只有1个字节可用,而在普通套接字上调用recv时,我的应用程序中通常会立即有150个字节可用?对此有何想法? – user202987 2014-10-10 16:20:46

+0

有时候,SSL有点棘手,因为它是如何构建的(我不打算在这里详细说明,因为这是一个相当长和复杂的解释,特别是如果您对SSL的知识有限)。然而,手册明确指出*“[...]由于SSL(和TLS)协议在TCP之上有其自己的组帧,因此SSL套接字抽象在某些方面可能与正常的OS级别插座。“*。 – netcoder 2014-10-10 16:25:43

+0

即:在OS套接字中可用并不一定意味着在SSL套接字中可用。 – netcoder 2014-10-10 16:31:11