Python客户端服务器套接字发送和恢复问题

时间:2017-04-11 22:36:20

标签: python python-3.x sockets tcp

我在test_client和test_server之间成功发送和接收了一些发送和接收。但是当我输入4个或5个以上的数据并在input()函数中单击后输入时程序挂起。我想我已经将问题缩小到可能是rdt_rcv()或udt_send()函数。我用注释突出显示了发送者和接收者的rdt_rcv()函数,并在udt_send()函数上面添加了注释。但我看不出这些功能有什么问题。当然它可能是别的但我认为问题是我上面提到的两个功能之一。尝试首先运行test_server,然后使用rdt.py在与2个测试模块相同的文件夹中运行test_client。

test_client.py

import socket, rdt, sys

TCP_IP = 'localhost'
TCP_PORT = 10000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))

InitialSeqNumber = 0
NextSeqNum = InitialSeqNumber
SendBase = InitialSeqNumber

while 1:
    d = input("Input data: ")
    data = rdt.rdt_send(d)
    data = int(data)

    if rdt.rdt_send_called == 1:
        checksum = 0xFFFF - data # Assuming 28 byte data
        sndpkt = rdt.packet(NextSeqNum, 0, checksum, data)

        rdt.udt_send(sndpkt, s)
        NextSeqNum = NextSeqNum + sys.getsizeof(data)
        #####################################
        seq, ack, check, dat = rdt.rdt_rcv(s)
        #####################################
        rdt.rdt_send_called = 0

        print ("Sequence Number: " + str(seq))
        print ("ACK Number: " + str(ack))
        print ("Checksum Value: " + hex(check))
        print ("Data: " + str(dat))
        print ('\n')
s.close()

rdt.py

rdt_send_called = None
timeout_event = None
ACK_received = None
BUFFER_SIZE = 1024

class packet:
    def __init__(self, seq_num, ack_num, checksum, data):
        self.seq_num = seq_num
        self.ack_num = ack_num
        self.checksum = checksum
        self.data = data

def rdt_send(data):
    d = data
    global rdt_send_called
    rdt_send_called = 1
    return d

    # PROBLEM MAY BE WITH THIS FUNCTION
def udt_send(sndpkt, s):
    s.send((str(sndpkt.seq_num)).encode())
    s.send((str(sndpkt.ack_num)).encode())
    s.send((str(sndpkt.checksum)).encode())
    s.send((str(sndpkt.data)).encode())

    # PROBLEM IS MOST LIKELY WITH THIS FUNCTION
def rdt_rcv(conn):
    field1 = conn.recv(BUFFER_SIZE)
    field1 = int(field1)
    field2 = conn.recv(BUFFER_SIZE)
    field2 = int(field2)
    #if field2 != 0:
        #global ACK_received
        #ACK_received = 1
    field3 = (conn.recv(BUFFER_SIZE))
    field3 = int(field3)
    field4 = (conn.recv(BUFFER_SIZE))
    field4 = int(field4)
    return field1, field2, field3, field4


def deliver_data(data): 
    pass

def timeout():
    global timeout_event
    timeout_event = 1

test_server.py

import socket, rdt, sys

TCP_IP = '127.0.0.1'
TCP_PORT = 10000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
while 1:
    dont_send_ACK = 0
    #####################################################
    seq_num, ack_num, check_sum, data = rdt.rdt_rcv(conn)
    #####################################################
    print ("Sequence Number: " + str(seq_num))
    print ("ACK number: " + str(ack_num))
    print ("Checksum Value: " + hex(check_sum))
    print ("Data: " + hex(data))
    print ('\n')

    if data + check_sum != 0xFFFF:
        dont_send_ACK = 1 # sender will timeout 
    else:
        rdt.deliver_data(data)
    if dont_send_ACK == 0:
        ACK = seq_num + sys.getsizeof(data)
        checksum = 0xFFFF - ACK
        sndpkt = rdt.packet(0, ACK, checksum, 0)
        rdt.udt_send(sndpkt, conn)

conn.close()

0 个答案:

没有答案