Skip to content

Instantly share code, notes, and snippets.

@pombredanne
Forked from geertj/winsocketpair.py
Created October 3, 2024 16:11
Show Gist options
  • Select an option

  • Save pombredanne/54e150b46076b4c6ce19ac50fafda4f5 to your computer and use it in GitHub Desktop.

Select an option

Save pombredanne/54e150b46076b4c6ce19ac50fafda4f5 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment