Skip to content

Instantly share code, notes, and snippets.

@geertj
Last active April 12, 2021 08:13
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save geertj/4325783 to your computer and use it in GitHub Desktop.
Save geertj/4325783 to your computer and use it in GitHub Desktop.
Emulates the UNIX socketpair() system call on Windows. This function uses a trick with non-blocking sockets to prevent the need for a thread. A socketpair can be used as a full-duplex, select()able pipe on Windows.
def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0):
"""Emulate the Unix socketpair() function on Windows."""
# We create a connected TCP socket. Note the trick with setblocking(0)
# that prevents us from having to create a thread.
lsock = socket.socket(family, type, proto)
lsock.bind(('localhost', 0))
lsock.listen(1)
addr, port = lsock.getsockname()
csock = socket.socket(family, type, proto)
csock.setblocking(0)
try:
csock.connect((addr, port))
except socket.error, e:
if e.errno != errno.WSAEWOULDBLOCK:
raise
ssock, addr = lsock.accept()
csock.setblocking(1)
lsock.close()
return (ssock, csock)
@ell1e
Copy link

ell1e commented Oct 30, 2020

<removed for now, will relink later>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment