You need to write an IPv6 compliant server or client and wonder what could be the differences between an IPv6 compliant server or client and its IPv4 counterpart.
We use the same approach as writing an echo client/server using IPv6. The only major difference is how the socket is created using IPv6 information.
Listing 12a shows an IPv6 echo server, as follows:
#!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - 3 # This program is optimized for Python 2.7. # It may run on any other version with/without modifications. import argparse import socket import sys HOST = 'localhost' def echo_server(port, host=HOST): """Echo server using IPv6 """ for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE): af, socktype, proto, canonname, sa = res try: sock = socket.socket(af, socktype, proto) except socket.error, err: print "Error: %s" %err try: sock.bind(sa) sock.listen(1) print "Server listening on %s:%s" %(host, port) except socket.error, msg: sock.close() continue break sys.exit(1) conn, addr = sock.accept() print 'Connected to', addr while True: data = conn.recv(1024) print "Received data from the client: [%s]" %data if not data: break conn.send(data) print "Sent data echoed back to the client: [%s]" %data conn.close() if __name__ == '__main__': parser = argparse.ArgumentParser(description='IPv6 Socket Server Example') parser.add_argument('--port', action="store", dest="port", type=int, required=True) given_args = parser.parse_args() port = given_args.port echo_server(port)
Listing 12b shows an IPv6 echo client, as follows:
#!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - 3 # This program is optimized for Python 2.7. # It may run on any other version with/without modifications. import argparse import socket import sys HOST = 'localhost' BUFSIZE = 1024 def ipv6_echo_client(port, host=HOST): for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: sock = socket.socket(af, socktype, proto) except socket.error, err: print "Error:%s" %err try: sock.connect(sa) except socket.error, msg: sock.close() continue if sock is None: print 'Failed to open socket!' sys.exit(1) msg = "Hello from ipv6 client" print "Send data to server: %s" %msg sock.send(msg) while True: data = sock.recv(BUFSIZE) print 'Received from server', repr(data) if not data: break sock.close() if __name__ == '__main__': parser = argparse.ArgumentParser(description='IPv6 socket client example') parser.add_argument('--port', action="store", dest="port", type=int, required=True) given_args = parser.parse_args() port = given_args.port ipv6_echo_client(port)
The server output is as follows:
$ python 3_12a_ipv6_echo_server.py --port=8800 Server lisenting on localhost:8800 Connected to ('127.0.0.1', 35034) Received data from the client: [Hello from ipv6 client] Sent data echoed back to the client: [Hello from ipv6 client]
The client output is as follows:
$ python 3_12b_ipv6_echo_client.py --port=8800 Send data to server: Hello from ipv6 client Received from server 'Hello from ipv6 client'
The IPv6 echo server first determines its IPv6 information by calling socket.getaddrinfo()
. Notice that we passed the AF_UNSPEC
protocol for creating a TCP socket. The resulting information is a tuple of five values. We use three of them, address family, socket type, and protocol, to create a server socket. Then, this socket is bound with the socket address from the previous tuple. It then listens to the incoming connections and accepts them. After a connection is made, it receives data from the client and echoes it back.
On the client-side code, we create an IPv6-compliant client socket instance and send the data using the send()
method of that instance. When the data is echoed back, the recv()
method is used to get it back.
3.139.97.53