Skip to content

Instantly share code, notes, and snippets.

@agronholm
Created January 23, 2013 20:36
Show Gist options
  • Save agronholm/4612817 to your computer and use it in GitHub Desktop.
Save agronholm/4612817 to your computer and use it in GitHub Desktop.
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