【发布时间】:2014-07-24 12:14:48
【问题描述】:
遗憾的是,标准 Python 函数 socket.socketpair 在 Windows 上不可用(从 Python 3.4.1 开始),我如何编写一个在 Unix 和 Windows 上都可以使用的替代函数?
【问题讨论】:
标签: python windows sockets python-3.4
遗憾的是,标准 Python 函数 socket.socketpair 在 Windows 上不可用(从 Python 3.4.1 开始),我如何编写一个在 Unix 和 Windows 上都可以使用的替代函数?
【问题讨论】:
标签: python windows sockets python-3.4
Python 3.5 包括 Windows 对 socket.socketpair() 的支持。对于 Python 2.7+,您可以在 PyPi 上使用 backports.socketpair package(我编写的):
import socket
import backports.socketpair
s1, s2 = 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
【讨论】:
errno.EWOULDBLOCK 而不是数字 10035。