C语言TCP服务端逻辑移植Python时接收缓冲区覆盖问题求助
TCP Socket Python实现问题修复
现存问题
- 套接字操作对象错误:
accept()返回的c才是和对应客户端通信的套接字,你使用监听套接字server_tcp调用recv()、send()属于逻辑错误,TCP收发数据必须使用和客户端绑定的连接套接字c。 - 循环逻辑错误:你将
accept()放在指令处理循环内部,每次循环都会等待新连接,且循环末尾加了break,处理一次请求就直接退出程序,自然无法接收同一客户端发送的第二个指令。 - 语法&类型错误:
if判断语句后缺少冒号,Python3中socket收发默认是字节类型,不能直接和字符串'A'/'B'做等值判断,需要先解码为字符串。 - 冗余缓冲区定义:Python的
socket.recv()会直接返回接收到的字节内容,不需要提前定义类似C语言的recv_buf = "\0" * 1024,无需手动处理缓冲区覆盖问题。
修正后代码
import socket # 监听套接字初始化,可根据实际需求修改IP、端口配置 server_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_tcp.bind(('0.0.0.0', 9000)) server_tcp.listen(10) while True: # 等待客户端接入 client_conn, client_addr = server_tcp.accept() # 单个客户端连接后循环处理其发送的所有指令,对齐C代码逻辑 while True: try: recv_data = client_conn.recv(1024) # 客户端主动断开连接时recv返回空字节,跳出循环等待下一个客户端 if not recv_data: break # 字节转字符串,编码格式和客户端保持一致即可 recv_str = recv_data.decode('utf-8').strip() # 仅判断首字符,和原C代码逻辑完全对齐 if recv_str.startswith(('A', 'B')): client_conn.send('OK'.encode('utf-8')) else: print('I did not get the right command DEF') client_conn.send('FAIL'.encode('utf-8')) except ConnectionResetError: # 处理客户端异常断开场景 break client_conn.close()
验证说明:代码运行后同一客户端先后发送B、A指令,会依次收到两次OK响应,完全符合预期。如果需要支持多客户端同时连接,可引入多线程、协程处理每个客户端的连接逻辑。
内容的提问来源于stack exchange,提问作者fpga
相关产品推荐
相关产品推荐

