8 # action can be reflect or drop
13 def test_data(data, n_rcvd):
15 for i in range(n_read):
16 expected = (n_rcvd + i) & 0xFF
17 byte_got = ord(data[i])
18 if byte_got != expected:
20 "Difference at byte {}. Expected {} got {}".format(
21 n_rcvd + i, expected, byte_got
27 def handle_connection(connection, client_address):
28 print("Received connection from {}".format(repr(client_address)))
32 data = connection.recv(4096)
36 n_rcvd += test_data(data, n_rcvd)
38 connection.sendall(data)
43 def run_tcp_server(ip, port):
44 print("Starting TCP server {}:{}".format(repr(ip), repr(port)))
45 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
46 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
47 server_address = (ip, int(port))
48 sock.bind(server_address)
51 connection, client_address = sock.accept()
52 handle_connection(connection, client_address)
55 def run_udp_server(ip, port):
56 print("Starting UDP server {}:{}".format(repr(ip), repr(port)))
57 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
58 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
59 server_address = (ip, int(port))
60 sock.bind(server_address)
62 data, addr = sock.recvfrom(4096)
64 # snd_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
65 sock.sendto(data, addr)
68 def run_server(ip, port, proto):
70 run_tcp_server(ip, port)
72 run_udp_server(ip, port)
75 def prepare_data(power):
77 for i in range(0, pow(2, power)):
82 def run_tcp_client(ip, port):
83 print("Starting TCP client {}:{}".format(repr(ip), repr(port)))
84 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
85 server_address = (ip, int(port))
86 sock.connect(server_address)
88 data = prepare_data(16)
94 timeout = time.time() + 2
95 while n_rcvd < n_sent and time.time() < timeout:
99 for i in range(n_read):
100 if data[n_rcvd + i] != tmp[i]:
102 "Difference at byte {}. Sent {} got {}".format(
103 n_rcvd + i, data[n_rcvd + i], tmp[i]
108 if n_rcvd < n_sent or n_rcvd > n_sent:
109 print("Sent {} and got back {}".format(n_sent, n_rcvd))
111 print("Got back what we've sent!!")
117 def run_udp_client(ip, port):
118 print("Starting UDP client {}:{}".format(repr(ip), repr(port)))
120 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
121 server_address = (ip, int(port))
122 data = prepare_data(10)
124 for i in range(0, n_packets):
125 sock.sendto(data, server_address)
130 def run_client(ip, port, proto):
132 run_tcp_client(ip, port)
134 run_udp_client(ip, port)
137 def run(mode, ip, port, proto):
139 run_server(ip, port, proto)
140 elif mode == "client":
141 run_client(ip, port, proto)
143 raise Exception("Unknown mode. Only client and server supported")
146 if __name__ == "__main__":
147 parser = argparse.ArgumentParser()
148 parser.add_argument("-m", action="store", dest="mode")
149 parser.add_argument("-i", action="store", dest="ip")
150 parser.add_argument("-p", action="store", dest="port")
151 parser.add_argument("-proto", action="store", dest="proto")
152 parser.add_argument("-a", action="store", dest="action")
153 parser.add_argument("-t", action="store", dest="test")
154 results = parser.parse_args()
155 action = results.action
157 run(results.mode, results.ip, results.port, results.proto)
158 # if (len(sys.argv)) < 4:
159 # raise Exception("Usage: ./dummy_app <mode> <ip> <port> [<action> <test>]")
160 # if (len(sys.argv) == 6):
161 # action = sys.argv[4]
162 # test = int(sys.argv[5])
163 # run (sys.argv[1], sys.argv[2], int(sys.argv[3]))