| #! /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', `data`, 'from', `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', `data`, 'from', `fromaddr` | 
 |  | 
 | main() |