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

C中转程序意外向Server A发送非Idle数据?抓包异常排查求助

问题:C语言中转程序意外向Server A发送非预期数据

程序功能与架构

我开发了一个C语言程序作为Server A和Server B的中间解释器:

  • Server A通过套接字infd向我的程序发送数据,程序转译后通过outfd转发至Server B
  • infd在main()中创建,程序生命周期内始终保持连接;outfd则是每次声明、连接、写入数据后,读取Server B返回的CLI提示符(使其能接收更多命令),最后干净关闭并终止该套接字
  • 除了用于接收Server A连接的监听套接字外,所有套接字均设置为NON_BLOCKING模式

写入Server A的逻辑

程序仅在读取到infd传来的"idle"消息时,才会向infd写入数据,写入的是硬编码的3字节内容:

// 声明与发送均在main()中执行
unsigned char idle[3];  
idle[0]=0xF1;
idle[1]=0x00;
idle[2]=0xFF;

res = write(infd,idle,3);

整个应用中没有其他向infd写入数据的代码。

异常现象

通过抓包工具发现,程序会向Server A发送两个非预期的数据包:

  • 一个包含Server B返回的CLI提示符
  • 另一个是0x0D(回车符)
    Server A收到这些数据后,会进入消息队列无法发送的状态,必须重启数据接口才能恢复。

转发逻辑的预期与实际表现

  • 预期:仅向Server A发送上述3字节的"idle"响应
  • 实际:转译后的数据确实通过outfd发送给了Server B,且程序向outfd写入的0x0D也能被Server B正常接收处理

源码中所有write调用(grep结果)

// 此段位于main()调用的子函数中
int n,outfd;  // 注:outfd是局部变量,非全局
n=write(outfd,buf,strlen(buf));  // 发送转译后的数据
write(outfd,"\r",1);  // 释放Server B的CLI接口

// 此段位于main()中
res=write(infd,idle,3);

测试验证结果

用两个终端窗口模拟服务器进行测试:

  • 第一个窗口用netcat模拟Server A,发送与实际场景相同的消息及"idle"消息,输出重定向至十六进制转储文件
  • 第二个窗口用netcat模拟Server B
    测试结果符合预期,转储文件仅显示硬编码的idle响应:
LTR~# hexdump  hex.dat
    0000000 00f1 00ff
    0000003

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:17:13