Python套接字ValueError:要解压缩的值太多(应为2个)

2024-10-02 22:25:01 发布

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

我的套接字只接收数据,而不接收地址,因此无法向原始发件人发送确认等数据包。我正在用发送方和接收方实现一个返回N。 以下是错误:

Traceback (most recent call last):
  File "./netster.py", line 128, in <module>
    main()
  File "./netster.py", line 120, in main
    run_server(args.host, int(args.port), udp=args.udp, rudp = args.rudp, filename=f) 
  File "./netster.py", line 27, in run_server
    rudp_gobackn_recv(port, kwargs['filename'])
  File "/Users/a3.py", line 352, in rudp_gobackn_recv
    data, client_address = serversocket.recv(1500)
ValueError: too many values to unpack (expected 2)

这是事情的接收方,一个代码片段,显示了我如何初始化数据包和接收数据

serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serversocket.bind(('localhost', port))
...
data, client_address = serversocket.recv(1500)

以下是我设置发件人套接字的方式:

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = (host, port)

发送方和接收方的地址和端口均为

('localhost', 1234)

1234是任意端口号。 以下是我如何设置要发送的数据包(以防万一),以及我如何发送数据包

for x in range(len(window), window_size):
            data = file.read(data_size)
            if not data:
                end_bit = '1'
            decoded_data = data.decode('utf-8')
            packet = str(nextseqnum) + "@@" + str(end_bit) + "@@" + str(decoded_data)
            nextseqnum = str(int(nextseqnum) + 1)
            window.append(packet)
            if not data:
                break

以下是我发送的方式:

for y in range(0, len(window)):
            print("Window: ", window)
            print("PACKET!!!!", window[y])
            packet = window[y]
            p = packet.encode('utf-8')
            print("Socket ouput: ", clientsocket.sendto(p, server_address))
            if(y == 0):
                oldest_time = time.time()

如果我更改接收器代码,使其可以编译为:

data  = serversocket.recv(1500)

内容的发送方会打印出:

Window:  ['1@@0@@abcdefghijklmnopqrstuvwxyz\n', '2@@1@@']
PACKET!!!! 1@@0@@abcdefghijklmnopqrstuvwxyz

Socket ouput:  33
Window:  ['1@@0@@abcdefghijklmnopqrstuvwxyz\n', '2@@1@@']
PACKET!!!! 2@@1@@
Socket ouput:  6

有没有想过为什么它只发送数据,而不发送服务器地址?我已经研究了这个问题,但没有成功,并且调试了一段时间


Tags: inpydataserverportaddresslineargs
1条回答
网友
1楼 · 发布于 2024-10-02 22:25:01

serversocket.recv(1500)只返回字节,不返回data, client_address。你在找recvfrom

这应该会让你明白为什么你会犯这样的错误:

>>> data, client_address = b"hello"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> a, b, c, d, e = b"hello"
>>> a, b, c, d, e
(104, 101, 108, 108, 111)

相关问题 更多 >