#! /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()
