如何在Windows上模拟socket.socketpair

3 投票
2 回答
3174 浏览
提问于 2025-04-18 14:36

标准的Python函数 socket.socketpair 在Windows上不支持(截至Python 3.4.1),那么我该如何编写一个可以在Unix和Windows上都能使用的替代方案呢?

2 个回答

5

Python 3.5 版本开始支持在 Windows 系统上使用 socket.socketpair() 这个功能。如果你使用的是 Python 2.7 及以上版本,可以在 PyPi 上使用一个叫 backports.socketpair 的包(这个包是我写的):

import socket
import backports.socketpair

s1, s2 = socket.socketpair()
2

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们在写代码的时候没有注意到一些细节,或者对某些概念理解得不够透彻。

当我们在网上寻找解决方案时,像StackOverflow这样的社区非常有帮助。在这里,很多经验丰富的程序员会分享他们的知识和经验,帮助我们解决问题。

如果你在学习编程,遇到困难,不要气馁。多看看别人的问题和答案,慢慢你会发现,很多问题其实都是可以通过一些简单的调整或者理解来解决的。

记得保持好奇心,勇于尝试,编程的世界很大,等待你去探索!

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

撰写回答