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

