Created
January 23, 2013 20:36
-
-
Save agronholm/4612817 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def _socket(self): | |
"""Create a listening socket. | |
This handles IPv6 and allows socket re-use by spawned processes. | |
""" | |
host, port = self.address | |
families = set() | |
for family, kind, protocol, cname, sa in socket.getaddrinfo(host or None, port, flags=socket.AI_PASSIVE): | |
families.add(family) | |
family = socket.AF_INET6 if socket.AF_INET6 in families else socket.AF_INET | |
sock = socket.socket(family, socket.SOCK_STREAM) | |
flags = fcntl.fcntl(sock.fileno(), fcntl.F_GETFD) | |
flags |= fcntl.FD_CLOEXEC | |
fcntl.fcntl(sock.fileno(), fcntl.F_SETFD, flags) | |
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) | |
sock.setblocking(0) | |
if socket.AF_INET not in families: | |
try: | |
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) | |
except (AttributeError, socket.error): | |
pass | |
return sock |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment