我有我试图移动到SSL上的蟒蛇2.5套接字服务器,但我已经运行到与pyOpenSSL一个障碍。我找不到使用它的任何好的教程,所以我就猜测主要工作。

下面是我的服务器如何设置插座:

ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file ("mykey.pem")
ctx.use_certificate_file("mycert.pem")
sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
addr = ('', int(8081))
sock.bind(addr)
sock.listen(5)

下面是如何接受客户端:

sock.setblocking(0)
while True:
  if len(select([sock], [], [], 0.25)[0]):
    client_sock, client_addr = sock.accept()
    client = ClientGen(client_sock)

和这里是如何发送从所连接的插座/接收:

while True:
  (r, w, e) = select.select([sock], [sock], [], 0.25)

  if len(r):
    bytes = sock.recv(1024)
  if len(w):
    n_bytes = sock.send(self.message)

这是紧凑,但你的总体思路。问题是,一旦发送/接收循环开始,死了马上,之前已发送或接收任何东西(我可以看到反正):

Traceback (most recent call last):
  File "ClientGen.py", line 50, in networkLoop
    n_bytes = sock.send(self.message
WantReadError

在“WantReadError”的手册的描述很模糊,说这可以来自任何地方。我在做什么错了?

有帮助吗?

解决方案

有时为了送SSL连接的应用程序字节,你需要能够首先从连接读取多个字节。 WantReadError是这种情况下,如何表示。你做错了,唯一的事情是,你不处理WantReadError然后等到select表示该插座的读取的您重新尝试呼叫send之前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top