You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TCP客户端与W5500连接后conn.recv()报错断开问题求助

W5500 TCP连接recv报错:TypeError: unsupported types for gt: 'NoneType', 'int'

问题描述

TCP客户端与W5500已成功建立连接(打印出"socket connected"),但调用conn.recv(10)时触发错误,未发送任何数据就自动断开连接,报错信息为:

TypeError: unsupported types for __gt__: 'NoneType', 'int'

原代码

socket.set_interface(eth)
server = socket.socket()  # Allocate socket for the server
server_ip = None  # IP address of server
server_port = 50007  # Port to listen on
server.bind((server_ip, server_port))  # Bind to IP and Port
server.listen()  # Begin listening for incoming clients

conn, addr = server.accept()  # Wait for a connection from a client.
print("socket connected")
while True:
eth.maintain_dhcp_lease()

    led.value = not led.value
    time.sleep(1)
    with conn:
        # data = conn.recv()
        # print(data)
        # conn.send(data)  # Echo message back to client
        while True:
            data = conn.recv(10)
            if data:
                print(data)
                conn.send(data)  # Echo message back to client
                break

运行日志

Wiznet5k SimpleServer Test (no DHCP)
Ethernet link is down…
Chip Version: w5500
MAC Address: ['0xde', '0xad', '0xbe', '0xef', '0xfe', '0xed']
My IP address is: 192.168.1.8
*** Get socket.
Reserved sockets: [False, False, False, False, False, False, False]
Allocated socket # 1.
* Listening on port=50007, ip=192.168.1.8
*** Opening socket 1
* Opening W5k Socket, protocol=33
*** Get socket.
Allocated socket # 0
Dest is (192.168.1.11, 46396), Next listen socknum is #0
*** Get socket.
Reserved sockets: [True, False, False, False, False, False, False]
Allocated socket # 2.
* Listening on port=50007, ip=192.168.1.8
*** Opening socket 2
* Opening W5k Socket, protocol=33
socket connected
socket_available called on socket 1, protocol 33
*** Disconnecting socket 1
*** Closing socket 1
  Waiting for socket to close…
  Socket has closed.
Traceback (most recent call last):
  File "<stdin>", line 78, in <module>
  File "adafruit_wiznet5k/adafruit_wiznet5k_socket.py", line 276, in wrapper
  File "adafruit_wiznet5k/adafruit_wiznet5k_socket.py", line 499, in recv
  File "adafruit_wiznet5k/adafruit_wiznet5k_socket.py", line 276, in wrapper
  File "adafruit_wiznet5k/adafruit_wiznet5k_socket.py", line 598, in recv_into
TypeError: unsupported types for __gt__: 'NoneType', 'int'

解决方案

1. 修复代码缩进与逻辑错误

原代码存在两处致命问题:

  • 外层while True循环下的代码缩进错误,导致eth.maintain_dhcp_lease()等语句不在循环体内,逻辑混乱。
  • 误用with conn:语句:该语句会在代码块结束时自动关闭连接,你把它放在每秒执行的循环里,每次内层循环break后,连接就被强制关闭,后续再调用conn.recv()时操作的是已失效的socket对象,触发底层的None与int比较错误。

2. 修正后的代码示例

socket.set_interface(eth)
server = socket.socket()  # Allocate socket for the server
server_ip = None  # IP address of server
server_port = 50007  # Port to listen on
server.bind((server_ip, server_port))  # Bind to IP and Port
server.listen()  # Begin listening for incoming clients

conn, addr = server.accept()  # Wait for a connection from a client.
print("socket connected")
try:
    while True:
        eth.maintain_dhcp_lease()
        led.value = not led.value
        time.sleep(1)
        
        # 移除with语句,手动管理连接生命周期
        data = conn.recv(10)
        if data:
            print(data)
            conn.send(data)  # Echo message back to client
        # 可选:添加连接断开检测,比如recv返回空字节时主动关闭
        elif len(data) == 0:
            print("Client disconnected")
            break
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
    server.close()

3. 错误根源说明

日志中显示的*** Disconnecting socket 1、*** Closing socket 1就是with conn:语句自动关闭连接的结果。当连接关闭后,底层库中的socket状态变量变为None,后续调用recv()时尝试将None与整数做大于比较,触发TypeError。

内容的提问来源于stack exchange,提问作者April Sky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:27:55