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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:10