Wireshark捕获服务端向客户端发CR,但代码中CR发往其他IP/端口
结合你的场景,输入设备收到服务端发送的CR(0x0D),但代码逻辑中仅计划向第三方设备发送CR,可能的原因如下:
文件描述符混淆:检查
sendOutput函数中使用的文件描述符是否确实为outfd,是否存在变量名笔误(比如误写为infd)、赋值错误(比如初始化时把infd赋值给了outfd相关变量)。Linux下文件描述符是整数类型,一旦混淆,发送操作就会指向输入设备的连接。内存越界/缓冲区污染:
- 检查回复输入设备的字节序列缓冲区是否被意外修改:比如处理第三方设备数据时,CR字符(0x0D)写入了回复输入设备的缓冲区尾部,导致回复
idle消息时附带发送了CR。 - 确认缓冲区初始化是否彻底:如果使用栈上缓冲区且未清零,之前处理第三方数据时残留的CR可能被误发送。
- 检查回复输入设备的字节序列缓冲区是否被意外修改:比如处理第三方设备数据时,CR字符(0x0D)写入了回复输入设备的缓冲区尾部,导致回复
错误的IO函数使用:如果代码中混用了标准IO函数(如
printf、puts)和系统调用(如send),需确认是否将infd包装为FILE*对象后,调用了会自动添加换行/CR的函数(比如puts会默认追加\n,若开启了ONLCR终端属性会转换为\r\n)。即使是TCP Socket,若误设置了终端属性(比如调用tcsetattr操作了infd),也可能触发字符转换。逻辑分支漏洞:排查主循环中所有向
infd发送数据的分支,除了idle消息的回复,是否存在其他场景(比如接收错误、超时处理)发送了包含CR的响应?是否存在条件判断错误(比如误判输入设备数据为需要回复的指令,错误发送了CR)。异步操作干扰:如果程序使用了信号处理、异步IO(如
epoll回调),检查这些异步逻辑中是否存在向infd发送数据的代码,是否误将CR包含在内。抓包细节验证:再次确认Wireshark抓包的数据包方向——是否是服务端主动发起的发送,还是服务端转发了第三方设备回传的CR?虽然你排除了IP重复,但可通过数据包的 payload 内容结合业务逻辑进一步验证。
内容的提问来源于stack exchange,提问作者rabbit

