65 lines
1.5 KiB
Python
Executable File
65 lines
1.5 KiB
Python
Executable File
#! /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()
|