Почему у меня потерялись некоторые пакеты в localhost? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь разработать сервер и клиентские программы на Python 2.7, которые могут переключаться в UDP или TCP, на основе этой эхо-программы:

TCP против теста задержки сокета UDP

Сейчас я просто пытаюсь запрограммировать его как локальный хост

Когда я запускаю его в TCP (is_UDP = False), серверная программа показывает мне, что пакет не потерян (total_perdu= 0)

Но если я запускаю его в UDP (is_UDP = True), это дает мне потерянные пакеты.

Вот мой код для сервера:

import socket
from numpy import *

server_address = ("127.0.0.1", 4444)
client_address = ("127.0.0.1", 4445)
bufferSize  = 4096

# is_UDP = True
is_UDP = False

# Create a datagram socket
if is_UDP == True:
    UDP_Server_Socket_in = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    UDP_Server_Socket_in.bind(server_address)

    UDP_Server_Socket_out = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    UDP_Server_Socket_out.connect(client_address)

    connection = UDP_Server_Socket_in
    print("UDP server is running...")
else :
    TCP_Server_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCP_Server_Socket.bind(server_address)
    TCP_Server_Socket.listen(1)

    connection, client_address = TCP_Server_Socket.accept()
    print("TCP server is running...")

t = 0
total_perdu = 0
i = 0

while(True):
    i += 1

    # Receive packet from client
    data_2= connection.recv(bufferSize)
    tab=fromstring(data_2,dtype="int32")
    size=len(data_2)

    while size<bufferSize:
        data_2= connection.recv(bufferSize-size)
        size+=len(data_2)

    if data_2:
        perdu=int(tab[0])-t-1
        sperdu=""
        if perdu>0:
            total_perdu+=perdu
            sperdu = "(%d)"%(perdu)

        print "Receive data : %s  %d  %d %s" % (tab[0], len(tab), total_perdu,sperdu)
        t=int(tab[0])

Вот мой код для клиента:

import socket
from numpy import *
import time


server_address = ("127.0.0.1", 4444)
client_address = ("127.0.0.1", 4445)

# Packets variables
packet_size = 1024
total_packet = 1000

bufferSize = 4*packet_size


# Variables initialization

error = 0
total_throughput = 0
total_latene = 0
total_ratio = 0
total_stop_time_1 = 0
total_stop_time_3 = 0

# Creation of a packet
send_tab = zeros(packet_size, int)
for i in range(0, packet_size):
    send_tab[i] = i
data_size = (send_tab.size+8)*send_tab.itemsize
print "Data size : %d" % data_size
print "Tab : %s \n" % send_tab

# is_UDP = True
is_UDP = False

# Create a socket at client side
if is_UDP == True:
    UDP_Client_Socket_out = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    UDP_Client_Socket_out.connect(server_address)

    UDP_Client_Socket_in = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    UDP_Client_Socket_in.bind(client_address)

    connection = UDP_Client_Socket_out
    print("UDP client is running...")
else:
    TCP_Client_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCP_Client_Socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 0)
    TCP_Client_Socket.connect(server_address)
    connection = TCP_Client_Socket
    print("TCP client is running...")

start_time_0 = time.clock()

for packet_number in range(0,total_packet):
    send_tab[0] = packet_number

    # Send packet to server
    start_time=time.clock()
    sent = connection.send(send_tab)
    if sent:
        stop_time_1 = time.clock() - start_time

    # Calculate throughput and ratio
    throughput = data_size / (stop_time_1 * 1000000)

    print "stop_time_1 \t%f" % stop_time_1

    total_throughput += throughput

stop_time_3 = (time.clock() - start_time_0)

print "Results : \n"
print "     Packet error : %d \n" % error
print "     Thoughput: %f Mo/s \n " % (total_throughput/total_packet)
print "     total_stop_time_1 : %f s    \n " % (total_stop_time_1/total_packet)
print "     stop_time_3 : %f \n" % stop_time_3

Итак, у меня есть 3 вопроса по этому поводу:

  1. Это нормально, если некоторые пакеты теряются, даже если я делаю это как локальный хост?

  2. Если да, то почему?

  3. Будет ли у меня такая же проблема, если я запрограммирую ее в C ?

1 Ответ

0 голосов
/ 15 февраля 2019

Из вашего кода похоже, что вы ожидаете получать пакеты UDP в том же порядке, в котором вы их отправляете.Я не думаю, что вы теряете пакеты, но скорее порядок, в котором они получены сервером, не является ожидаемым (что нормально для UDP).

Кроме того, вы должны принять во внимание, что UDPне гарантирует ни порядок, ни получение пакетов, поэтому ваша программа должна принять это во внимание.

Я бы реорганизовал код и добавил tab в список, затем отсортировал его и проверил наличие пробелов (в конце передачи).Другим способом было бы отправить ответ с сервера и выполнить проверку на клиенте (но это может увеличить число, если вы развернете его в Интернете).

...