| #! /usr/bin/env python | 
 |  | 
 | # Client and server for udp (datagram) echo. | 
 | # | 
 | # Usage: udpecho -s [port]            (to start a server) | 
 | # or:    udpecho -c host [port] <file (client) | 
 |  | 
 | import sys | 
 | from socket import * | 
 |  | 
 | ECHO_PORT = 50000 + 7 | 
 | BUFSIZE = 1024 | 
 |  | 
 | def main(): | 
 |     if len(sys.argv) < 2: | 
 |         usage() | 
 |     if sys.argv[1] == '-s': | 
 |         server() | 
 |     elif sys.argv[1] == '-c': | 
 |         client() | 
 |     else: | 
 |         usage() | 
 |  | 
 | def usage(): | 
 |     sys.stdout = sys.stderr | 
 |     print('Usage: udpecho -s [port]            (server)') | 
 |     print('or:    udpecho -c host [port] <file (client)') | 
 |     sys.exit(2) | 
 |  | 
 | def server(): | 
 |     if len(sys.argv) > 2: | 
 |         port = eval(sys.argv[2]) | 
 |     else: | 
 |         port = ECHO_PORT | 
 |     s = socket(AF_INET, SOCK_DGRAM) | 
 |     s.bind(('', port)) | 
 |     print('udp echo server ready') | 
 |     while 1: | 
 |         data, addr = s.recvfrom(BUFSIZE) | 
 |         print('server received %r from %r' % (data, addr)) | 
 |         s.sendto(data, addr) | 
 |  | 
 | def client(): | 
 |     if len(sys.argv) < 3: | 
 |         usage() | 
 |     host = sys.argv[2] | 
 |     if len(sys.argv) > 3: | 
 |         port = eval(sys.argv[3]) | 
 |     else: | 
 |         port = ECHO_PORT | 
 |     addr = host, port | 
 |     s = socket(AF_INET, SOCK_DGRAM) | 
 |     s.bind(('', 0)) | 
 |     print('udp echo client ready, reading stdin') | 
 |     while 1: | 
 |         line = sys.stdin.readline() | 
 |         if not line: | 
 |             break | 
 |         s.sendto(line, addr) | 
 |         data, fromaddr = s.recvfrom(BUFSIZE) | 
 |         print('client received %r from %r' % (data, fromaddr)) | 
 |  | 
 | main() |