문제

Python 2.5의 SSL로 이동하려는 소켓 서버가 있지만 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