| #! /usr/bin/env python3 |
| |
| # 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 |
| print('addr = ', addr) |
| s.sendto(bytes(line, 'ascii'), addr) |
| data, fromaddr = s.recvfrom(BUFSIZE) |
| print('client received %r from %r' % (data, fromaddr)) |
| |
| main() |