표준 파이썬 함수 socket.socketpair은 유감스럽게도 Windows에서 사용할 수 없습니다 (Python 3.4.1). Unix와 Windows에서 모두 작동하는 대체품을 작성하려면 어떻게해야합니까?Windows에서 socket.socketpair를 에뮬레이트하는 방법
1
A
답변
3
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
2
에 대한 Windows 지원이 포함되어 있습니다. 파이썬 2.7 이상 들어 PyPi에 (내가 작성)을 backports.socketpair
package를 사용할 수 있습니다
import socket
import backports.socketpair
s1, s2 = socket.socketpair()
+0
만약이 문제가 Python 3.5부터 시작되었다는 지식과 그것을 가지고 있지 않은 버전에서 polyfill하는 PyPi 패키지가 있다는 사실 때문에 의심 할 여지없이 실제 루트 문제에 답할 수 있기 때문에 +1 할 수 있습니다. 이 질문에 대해 모든 사람을 압박합니다. – mtraceur
내가 사용하는 거라고'errno.EWOULDBLOCK' 아니라 수 10035. –
@RossRidge 감사보다. – aknuds1