如何在Windows上模拟socket.socketpair

标准的Python函数socket.socketpair不幸在Windows上不可用(从Python 3.4.1开始),我怎样才能编写一个可以在Unix和Windows上运行的替代品?

Solutions Collecting From Web of "如何在Windows上模拟socket.socketpair"

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 

Python 3.5包含Windows对socket.socketpair()支持。 对于Python 2.7+,你可以在PyPi上使用backports.socketpair包 (我创作的):

 import socket import backports.socketpair s1, s2 = socket.socketpair()