Python 如何在Windows上模拟socket.socketpair

Python 如何在Windows上模拟socket.socketpair,python,windows,sockets,python-3.4,Python,Windows,Sockets,Python 3.4,不幸的是,标准Python函数在Windows上不可用(从Python 3.4.1开始),如何编写一个既能在Unix上工作又能在Windows上工作的替换函数?Python 3.5包括Windows对socket.socketpair()的支持。对于Python 2.7+,可以在PyPi上使用(我编写的): import socket import errno def create_sock_pair(port=0): """Create socket pair. If s

不幸的是,标准Python函数在Windows上不可用(从Python 3.4.1开始),如何编写一个既能在Unix上工作又能在Windows上工作的替换函数?

Python 3.5包括Windows对
socket.socketpair()
的支持。对于Python 2.7+,可以在PyPi上使用(我编写的):

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

我会使用
errno.ewoodblock
而不是数字10035。如果可以的话,我会不止一次使用+1,因为我知道这个问题从Python 3.5开始就消失了,而且有一个PyPi包可以在没有它的版本上多填充它,回答了一个实际的根本问题,毫无疑问,这个问题驱使着几乎所有人。请添加完整的代码,因为链接(即使是到PyPi或GitHub的链接)可能会断开+1无论如何。
import socket
import backports.socketpair

s1, s2 = socket.socketpair()