首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Windows上模拟socket.socketpair

如何在Windows上模拟socket.socketpair
EN

Stack Overflow用户
提问于 2014-07-24 12:14:48
回答 2查看 2.8K关注 0票数 3

遗憾的是,标准的socket.socketpair函数在Windows上是不可用的(从Python3.4.1开始),我如何编写一个可以同时工作在Unix和Windows上的替换程序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-24 12:14:48

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2015-08-07 15:11:09

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

代码语言:javascript
复制
import socket
import backports.socketpair

s1, s2 = socket.socketpair()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24933411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档