2012-07-25 3 views
6
입니다.
sock.setblocking(0) 
try: 
    data = sock.recv(1024) 
except socket.error, e: 
    if e.args[0] == errno.EWOULDBLOCK: 
      print 'EWOULDBLOCK' 
else:    
    if not data: #recv over 
     sock.close() 
     print 'close================='  
    else: 
     print 'recv ---data---------' 
     poem += data 

위의 코드는 모두 루프에 있습니다. 데이터를 얻으려면 non-blocking socket (단지 '비 차단 소켓'을 테스트하고 싶음)을 사용하십시오. 하지만 항상 'EWOULDBLOCK'을 인쇄하십시오. 왜 그런지 모르십니까?비 차단 소켓입니다. 오류는 항상

+0

소켓 설정, 실행중인 Python 버전 및 OS 등 모든 코드를 추가하십시오. – StefanE

+1

참조 :'os.strerror (e.args [0])'는 에러 문자열을 출력합니다. – Alex

답변

9

소켓이 비 블로킹이므로 읽을 데이터가 없으면 recv()이 예외를 발생시킵니다. errno.EWOULDBLOCK = errno.EAGAIN = 11.이 코드는 나중에 OSPF recv()을 다시 시도해 보라고 알려주는 Python (실제로 OS 임)입니다.

이 예외가 발생할 때마다 소켓을 닫습니다. 그것은 전혀 도움이되지 않습니다. 귀하의 코드는 다음과 같이해야한다 :

import socket, errno, time 

sock = socket.socket() 
sock.connect(('hostname', 1234)) 
sock.setblocking(0) 

while True: 
    try: 
     data = sock.recv(1024) 
     if not data: 
      print "connection closed" 
      sock.close() 
      break 
     else: 
      print "Received %d bytes: '%s'" % (len(data), data) 
    except socket.error, e: 
     if e.args[0] == errno.EWOULDBLOCK: 
      print 'EWOULDBLOCK' 
      time.sleep(1)   # short delay, no tight loops 
     else: 
      print e 
      break 

이런 종류의 들어, select 모듈은 일반적으로 갈 수있는 방법입니다.

+0

감사합니다. 문제는 내가'time.sleep (1)'을 놓친다는 것을 발견했다. 인쇄물이 모두 'EWOULDBLOCK'이기 때문에. 왜 '빡빡한 고리'가 없어서는 안 되는가? – zhenyuyang

+0

@zhenyuyang ' 나는 그리워. '하지만 빡빡한 루프는 다른 스레드 나 프로세스를 실행하는 것과 같은 다른 일을 할 수있을 때 CPU주기를 낭비합니다. EWOULDBLOCK을 계속 읽으면 읽을 데이터가 없습니다. 그 조건을 원하지 않으면 왜 비 차단 모드를 사용하고 있습니까? – EJP

+0

여기서'socket.timeout' 예외가 중요합니까? – CMCDragonkai

3

non-blocking IO을 사용하고 있으므로 예외적으로 예외가 발생합니다.

주요 기계적인 차이

은 그 전송, RECV, 연결하고 아무 짓도하지 않고 반환 할 수 있습니다 동의합니다. 당신은 (물론) 많은 선택권을 가지고 있습니다. 반환 코드 및 오류 코드를 확인하고 일반적으로 자신을 미치게 만들 수 있습니다.

man errno 3를 실행하면, 당신은 EWOULDBLOCK의 설명을 참조하여야한다 Python doc

에서 인용. 아직 읽을 데이터가 없기 때문에 예외가 적당합니다.