经常发送UDP数据包确认 - Python

时间:2016-06-28 16:26:42

标签: python sockets networking tcp udp

我目前正在用Python编写一个简单的客户端/服务器UDP文件传输程序。我目前正在尝试实施一些措施来确保总数据传输。虽然我知道UDP并不以可靠性着称,但我必须使用UDP进行传输(我只是为一个更大的项目开发一个测试程序,而且该项目中使用的设备并非如此。能够使用TCP流。)

无论如何,通过实现一个简单的ACK系统,我可以将所有数据传输到客户端,其中客户端为它接收的每个数据包发送一个ACK。然而,这会降低传输速度(不是非常糟糕,但足以让我优化它)。

我降低速度的想法是每隔一段时间(而不是每个数据包)发送一个ACK。应该发送ACK的频率可能取决于接收的数据量(即每x个字节)或接收的数据包(即每x个数据包)。

但是,我在下面的当前系统中努力实现这一点:

服务器:

if(numSent >= 100):
            print "Waiting for an ACK now..."
            conn.settimeout(2)
            try:
                ACK = conn.recv(tcp_buf)
                print "ACK: " + ACK
                ackF.write(ACK+"\n")
            except socket.timeout:
                isClientCaughtUp = False
                conn.settimeout(None)
            if (isClientCaughtUp is False):
                if(s.sendto(chunk,addr) and s.sendto(str(local_ID),addr)):
                    ACK = conn.recv(tcp_buf)
                    ackF.write(ACK + "\n")
                    if (ACK):
                        isClientCaughtUp = True
                        conn.settimeout(2)
                        break
                    numSent = 0

客户端:

try:
    while(dataChunk):
        actualNumChunks += 1
        count += 1 
        f.write(dataChunk)
        sock.settimeout(6)
        dataChunk, addr = sock.recvfrom(buf)
        packID, junkAddr = sock.recvfrom(buf)
        if(count >= 100):
            #print "ACK sent!"
            tcp_sock.send("1")
            count = 0
except socket.timeout:
    f.close()
    sock.close()

现在,我相信我的套接字超时有问题。服务器不发送所有数据包,也不接收任何确认。这是对原始代码的一个非常小的修改,让我为发送的每个数据包发送/接收ACK。此外,我现在只发送垃圾ACK。

此外,该程序通过TCP进行通信(ACK和其他一些东西),而数据本身则通过UDP发送。它们是两个不同的插座。

0 个答案:

没有答案