Python客户机服务器套接字发送和接收问题

2024-04-27 00:40:41 发布

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

我已经成功的发送和接收之间的test_客户端和测试_服务器的一些发送和接收。但当我输入超过4或5个数据,并在input()函数中的每个数据之后单击enter,程序就会挂起。我想我已经把问题缩小到可能是rdt_rcv()或udt_send()函数。我用注释突出显示了发送方和接收方的rdt_rcv()函数,并在udt_send()函数上方添加了一条注释。但我看不出这些函数有什么问题。当然,它可能是其他的,但我认为问题是我上面提到的两个函数之一。尝试运行程序,首先运行test_server,然后使用rdt.py公司与2个测试模块在同一个文件夹中。在

试验_客户端.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公司在

^{pr2}$

试验_服务器.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()

Tags: 函数pysenddatachecksocketnumseq