| 1 |
#!/usr/bin/env python |
|---|
| 2 |
"""Test socket connections on Ubuntu. |
|---|
| 3 |
|
|---|
| 4 |
Show specific behaviour when using ``socket.getaddrinfo`` with host argument |
|---|
| 5 |
set to ``None``. |
|---|
| 6 |
|
|---|
| 7 |
In this case, the address info for IPV6 will be returned first, so when the |
|---|
| 8 |
server listen socket is created based on this info, it will be IPV6, and when a |
|---|
| 9 |
client connects, its address will be a IPV6 address. |
|---|
| 10 |
|
|---|
| 11 |
Example client code:: |
|---|
| 12 |
|
|---|
| 13 |
import socket |
|---|
| 14 |
host = 'localhost' |
|---|
| 15 |
port = 8080 |
|---|
| 16 |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|---|
| 17 |
s.connect((host, port)) |
|---|
| 18 |
s.close() |
|---|
| 19 |
""" |
|---|
| 20 |
|
|---|
| 21 |
import socket |
|---|
| 22 |
import sys |
|---|
| 23 |
|
|---|
| 24 |
def main(args): |
|---|
| 25 |
sock = None |
|---|
| 26 |
flags = 0 |
|---|
| 27 |
|
|---|
| 28 |
try: |
|---|
| 29 |
host = args.pop(0) |
|---|
| 30 |
port = args.pop(0) |
|---|
| 31 |
except: |
|---|
| 32 |
host = '' |
|---|
| 33 |
# Uncomment following line and comment out line above for testing |
|---|
| 34 |
# differing behaviour related to IPV6. |
|---|
| 35 |
#host = '0.0.0.0' |
|---|
| 36 |
port = 8080 |
|---|
| 37 |
|
|---|
| 38 |
if host == '': |
|---|
| 39 |
host = None |
|---|
| 40 |
flags = socket.AI_PASSIVE |
|---|
| 41 |
info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, |
|---|
| 42 |
0, flags) |
|---|
| 43 |
print info |
|---|
| 44 |
|
|---|
| 45 |
af, socktype, proto, canonname, sa = info[0] |
|---|
| 46 |
try: |
|---|
| 47 |
sock = socket.socket(af, socktype, proto) |
|---|
| 48 |
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
|---|
| 49 |
sock.bind((host or '', port)) |
|---|
| 50 |
except socket.error, msg: |
|---|
| 51 |
if sock: |
|---|
| 52 |
sock.close() |
|---|
| 53 |
print "Error: could not open socket '%s' port %s'" % (host, port) |
|---|
| 54 |
return 1 |
|---|
| 55 |
else: |
|---|
| 56 |
sock.listen(1) |
|---|
| 57 |
print "Listening on '%s' port %s'" % (host, port) |
|---|
| 58 |
|
|---|
| 59 |
while True: |
|---|
| 60 |
try: |
|---|
| 61 |
s, addr = sock.accept() |
|---|
| 62 |
print "Remote address: %s" % (addr,) |
|---|
| 63 |
except KeyboardInterrupt: |
|---|
| 64 |
break |
|---|
| 65 |
return 0 |
|---|
| 66 |
|
|---|
| 67 |
if __name__ == '__main__': |
|---|
| 68 |
sys.exit(main(sys.argv[1:])) |
|---|