Untitled

mail@pastecode.io avatar
unknown
python
a year ago
2.0 kB
0
Indexable
Never
import argparse
import socket
 
def recvall(sock, length):
    data = b''
    while len(data) < length:
        more = sock.recv(length - len(data))
        if not more:
            raise EOFError(f"Was expecting {length} bytes but only received {len(data)} bytes before the socket closed")
        data += more
    return data
 
def server(interface, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((interface, port))
    sock.listen(1)
    print('Listening at', sock.getsockname())
    while True:
        print('Waiting to accept a new connection')
        sc, sockname = sock.accept()
        print('We have accepted a connection from', sockname)
        print('Socket name:', sc.getsockname())
        print('Socket peer:', sc.getpeername())
        message = recvall(sc, 12)
        msg = message.decode()
        rev = msg.split(' ')
        line = rev[1] + ' ' + rev[0]
        print('Incoming sixteen-octet message:', repr(message))
        sc.sendall(line.encode())
        sc.close()
        print('Reply sent, socket closed')
 
def client(host, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    print('Client has been assigned socket name', sock.getsockname())
    sock.sendall(b'Pavlat Oleksandr 123')
    reply = recvall(sock, 12)
    print('The server said', repr(reply))
    sock.close()
 
if __name__ == '__main__':
    choices = {'client': client, 'server': server}
    parser = argparse.ArgumentParser(description='Send and receive over TCP')
    parser.add_argument('role', choices=choices, help='which role to play')
    parser.add_argument('host', help='interface the server listens at; host the client sends to')
    parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='TCP port (default 1060)')
    args = parser.parse_args()
    function = choices[args.role]
    function(args.host, args.p)