主页 M

MP-TCP下传文件试验

2020-12-01 网页编程网 网页编程网

1.test_topology.py

#!/usr/bin/python

from mininet.topo import Topo, SingleSwitchTopo
from mininet.net import Mininet
from mininet.log import lg, info
from mininet.cli import CLI

def main():
    lg.setLogLevel('info')

    net = Mininet(SingleSwitchTopo(k=2))
    net.start()

    h1 = net.get('h1')
    h2 = net.get('h2')
    s1 = net.get('s1')

    net.addLink(h1, s1)

    h1.setIP('10.0.1.1', intf='h1-eth0')
    h1.setIP('10.0.1.2', intf='h1-eth1')
    h2.setIP('10.0.1.3', intf='h2-eth0')
    CLI( net )
    net.stop()

if __name__ == '__main__':
    main()

2.server.py

import socket, argparse

def recvall(filename, sock, delimiter):
    file_ = open(filename, 'wb')
    recvd_bytes = 0
    data = b''
    while True:
        more = sock.recv(1024)
        data += more
        if data[-4:] == delimiter:
            break
        data = data[-10:]
        file_.write(more)
        file_.flush()

    file_.close()

def server(ip, port, filename):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((ip, port))
    sock.listen(10)
    print('Listening at', sock.getsockname())
    while True:
        sc, sockname = sock.accept()
        print('We have accepted a connection from', sockname)
        print('  Socket name:', sc.getsockname())
        print('  Socket peer:', sc.getpeername())
        recvall(filename, sc, b'bye$')
        sc.sendall(b'Thank you$')
        sc.close()
        print('  Reply sent, socket closed')

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Send and receive over TCP')
    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()
    server(args.host, args.p, "server_recvd.mkv")

3.client.py

import socket, argparse

def recvall(sock, delimiter):
    data = b''
    while True:
        more = sock.recv(1)
        if more == delimiter:
            break
        data += more
    return data

def client(c_ip, s_ip, filename):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((c_ip, 1060))
    print('Client has been assigned socket name', sock.getsockname())
    sock.connect((s_ip, 1060))
    in_file = open(filename, 'rb')
    block_size = 32
    snd_bytes = 0
    while True:
        piece = in_file.read(block_size)
        snd_bytes += block_size
        print('\r  %d bytes send' % (snd_bytes,), )
        if piece == "":
            piece = b'bye$'
            sock.sendall(piece)
            break # end of file

        sock.sendall(piece)
    in_file.close()
    message = recvall(sock, b'$')
    print (message)
    sock.close()

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Send and receive over TCP')
    parser.add_argument('-c_ip')
    parser.add_argument('-s_ip')
    args = parser.parse_args()
    client(args.c_ip, args.s_ip, "client_send.mkv")

4.传输文件名:client_send.mkv,运行环境python3。

阅读原文
阅读 3556
123 显示电脑版