2014-07-24 1 views

답변

3
import socket 
import errno 


def create_sock_pair(port=0): 
    """Create socket pair. 

    If socket.socketpair isn't available, we emulate it. 
    """ 
    # See if socketpair() is available. 
    have_socketpair = hasattr(socket, 'socketpair') 
    if have_socketpair: 
     client_sock, srv_sock = socket.socketpair() 
     return client_sock, srv_sock 

    # Create a non-blocking temporary server socket 
    temp_srv_sock = socket.socket() 
    temp_srv_sock.setblocking(False) 
    temp_srv_sock.bind(('', port)) 
    port = temp_srv_sock.getsockname()[1] 
    temp_srv_sock.listen(1) 

    # Create non-blocking client socket 
    client_sock = socket.socket() 
    client_sock.setblocking(False) 
    try: 
     client_sock.connect(('localhost', port)) 
    except socket.error as err: 
     # EWOULDBLOCK is not an error, as the socket is non-blocking 
     if err.errno != errno.EWOULDBLOCK: 
      raise 

    # Use select to wait for connect() to succeed. 
    import select 
    timeout = 1 
    readable = select.select([temp_srv_sock], [], [], timeout)[0] 
    if temp_srv_sock not in readable: 
     raise Exception('Client socket not connected in {} second(s)'.format(timeout)) 
    srv_sock, _ = temp_srv_sock.accept() 

    return client_sock, srv_sock 
+1

내가 사용하는 거라고'errno.EWOULDBLOCK' 아니라 수 10035. –

+0

@RossRidge 감사보다. – aknuds1

2

에 대한 Windows 지원이 포함되어 있습니다. 파이썬 2.7 이상 들어 PyPi에 (내가 작성)을 backports.socketpair package를 사용할 수 있습니다

import socket 
import backports.socketpair 

s1, s2 = socket.socketpair() 
+0

만약이 문제가 Python 3.5부터 시작되었다는 지식과 그것을 가지고 있지 않은 버전에서 polyfill하는 PyPi 패키지가 있다는 사실 때문에 의심 할 여지없이 실제 루트 문제에 답할 수 있기 때문에 +1 할 수 있습니다. 이 질문에 대해 모든 사람을 압박합니다. – mtraceur