首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Socket - ValueError:要解压缩的值太多(应为2)

Python Socket - ValueError:要解压缩的值太多(应为2)
EN

Stack Overflow用户
提问于 2020-11-09 10:03:12
回答 1查看 441关注 0票数 0

我遇到了只接收数据而不是地址的套接字问题,因此我无法向原始发送者发送确认之类的数据包。我正在实现一个带有发送者和接收者的go-back-N。错误如下:

代码语言:javascript
复制
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)

这是接收端的代码片段,显示了如何初始化数据包和接收数据。

代码语言:javascript
复制
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serversocket.bind(('localhost', port))
...
data, client_address = serversocket.recv(1500)

下面是我设置发送者套接字的方法:

代码语言:javascript
复制
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = (host, port)

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

代码语言:javascript
复制
('localhost', 1234)

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

代码语言:javascript
复制
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

下面是我发送它的方式:

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
data  = serversocket.recv(1500)

事物的发送者端打印出来:

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-09 10:07:38

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

这应该会启发你为什么会犯这样的错误:

代码语言:javascript
复制
>>> 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64744980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档