如何在Windows上模拟socket.socketpair
标准的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