Udpinger服务器(心跳信号)和客户端

2024-04-26 16:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在用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))