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
相关产品推荐
相关产品推荐

