目前,我正在用Python构建我的Udpinger服务器和客户端
每当我在Pycharm中运行此代码时,只会显示丢弃的数据包,而不会显示ping数据包
我不知道我的代码出了什么问题。。plz帮助
这些代码是从stackoverflow和github收集的
分别是服务器代码和客户端代码
from socket import *
import time
import random
recieve_host = '127.0.0.1'
recieve_port = 1024
remote_host = '127.0.0.1'
remote_port = 12000
num_pings = 10
sequence_number = 1
min_rtt = 0
max_rtt = 0
avg_rtt = 0
packets_dropped = 0.0
total_packets = 0.0
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.settimeout(1.0)
serverSocket.bind((recieve_host, recieve_port))
def get_time():
return int(round(time.time() * 1000))
def wait_for_response():
global packets_dropped
while True:
try:
message, address = serverSocket.recvfrom(remote_port)
return message
except Exception as e:
packets_dropped = packets_dropped + 1
return 'ERROR 522 ' + str(get_time()) + ' TIMEOUT'
def send_message(message, wait=False):
serverSocket.sendto(message.encode('utf-8'), (remote_host, remote_port))
if wait is False:
return
else:
return wait_for_response()
while num_pings != 0:
time.sleep(1)
if random.randint(0, 10) < 4:
sequence_number = sequence_number + 1
print('Dropped, lol')
continue
message = 'PING ' + str(sequence_number) + ' ' + str(get_time())
recieved = bytes(send_message(message, True), encoding='utf-8')
recieved_size = len(recieved)
recieved_array = recieved.split(bytes(' ', encoding='utf-8'))
recieved_type = recieved_array[0].upper()
recieved_seq = recieved_array[1]
recieved_message = recieved_array[3]
recieved_time = int(recieved_array[2])
rtt = get_time() - recieved_time
if rtt > 1000:
continue
if recieved_type == 'PING':
print(str(recieved_size) + " bytes recieved from " + remote_host + ':' + str(remote_port) + ': seq=' + str(recieved_seq) + ' rtt=' + str(rtt))
avg_rtt = avg_rtt + rtt
if rtt < min_rtt or min_rtt == 0:
min_rtt = rtt
if rtt > max_rtt or max_rtt == 0:
max_rtt = rtt
sequence_number = sequence_number + 1
if recieved_type == 'ERROR':
print(recieved)
if recieved_message == 'TIMEOUT':
sequence_number = 1
print('Timeout: waiting 5 seconds before reconnect')
time.sleep(5)
num_pings -= 1
last = recieved
total_packets = total_packets + 1
print("RTT: min=" + str(min_rtt) + " max=" + str(max_rtt) + " avg=" + str(avg_rtt/10))
print("Packet Loss: " + str(packets_dropped/total_packets*100) + "%")
from socket import *
import time
import random
recieve_host = '127.0.0.1'
recieve_port = 12000
remote_host = '127.0.0.1'
remote_port = 1024
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind((recieve_host, recieve_port))
simulate_packet_loss = True
sleep_for_rand_response_times = True
message = ''
sequence_number = 0
recieved_time = 0
def wait_for_response():
print('Wait for response')
def get_time():
return int(round(time.time() * 1000))
def send_message(message, wait=False):
serverSocket.sendto(message, (remote_host, remote_port))
if not wait:
return
else:
return wait_for_response()
while True:
message, address = serverSocket.recvfrom(remote_port)
print(get_time() - recieved_time)
if recieved_time != 0 and get_time() - recieved_time > 5000:
print('Client disconnect (timeout)')
sequence_number = 0
recieved_time = 0
message = message.upper()
recieved_size = len(message)
recieved_array = message.split(bytes(' ', encoding='utf-8'))
recieved_type = recieved_array[0].upper()
recieved_seq = int(recieved_array[1])
recieved_time = int(recieved_array[2])
if recieved_seq != sequence_number+1:
if sequence_number != 0:
for i in range(sequence_number, recieved_seq):
print('Dropped Packet:' + str(i))
if sequence_number == 0:
print('Client connect.')
sequence_number = recieved_seq
print('Recieve: ' + str(message))
if sleep_for_rand_response_times:
min_sleep = 0.2
max_sleep = 1.0
time.sleep(random.uniform(min_sleep, max_sleep))
if simulate_packet_loss:
if random.randint(0, 10) < 2:
print('Dropped, lol')
continue
elif simulate_packet_loss:
if random.randint(0, 10) < 4:
print('Dropped, lol')
continue
serverSocket.sendto(message, address)
print('Send: ' + str(message))
目前没有回答
相关问题 更多 >
编程相关推荐