【QT】解决应用程序收不到指定端口数据的问题

30

背景

  • 前两天实习的时候,解决一版程序中的bug,修好后发现,其他机器可以正常运行,唯独有一台机子对我这版程序一直收不到数据。反而存在bug的版本,可以正常收数据。
  • 这里简要说明程序功能: 使用RJ45连接,使用局域网内的TCP进行通信。

解决

  • 先说最终的解决办法,控制面板->系统和安全->Windows Defender防火墙->允许应用或功能通过Windows Defender防火墙。
    • 然后找到程序,将这一行的三个勾都选上,(PS: 我也不太清楚这是为什么,跟我想得不太一下,详见【心路历程】。)点击确定, 重启你的程序。
    • 相关文章——Windows中公用网络与专用网络的区别
  • 最暴力的方式,直接把防火墙关闭。

心路历程

在问题发生的最初,首先使用Wireshark抓包,

  • 发现在发往本机的指定端口上的TCP三次握手建链包被标注为:
[TCP Retransmission]
[TCP Port numbers reused] 
  • [TCP Retransmission]为超时重传,说明对方迟迟得不到本机的响应。
  • 而[TCP Port numbers reused] ,从字面意义上直译,我以为是端口被占用,于是使用相关命令查看指定端口状态。问题并未解决。
netstat -ano | findstr "port number"
  • 经搜索资料发现,[TCP Port numbers reused] 并不是端口被占用,而是,Wireshark会把重复使用的ip+port打上标记,port numbers reused是一个标记。并不是错误提示。

TCP Port numbers reused

Set when the SYN flag is set (not SYN+ACK), we have an existing conversation using the same addresses and ports, and the sequence number is different than the existing conversation’s initial sequence number.

在设置 SYN 标志(不是 SYN+ACK)时设置,我们有一个使用相同地址和端口的现有会话,并且序列号与现有会话的初始序列号不同。

之后对程序进行入手。

  • 继续研究我尝试对程序入手,我尝试使用基于Qt图形界面的TCP/UDP调试工具对指定端口进行监听与模拟数据发送,并未得到响应。
  • 之后,开始在该机子上安装QT,尝试从源码寻找问题,但是我也觉得不是代码的问题,其一是我修改的部分并未涉及到数据通信代码,二是只有这台电脑运行程序存在问题,其他电脑可以正常运行,那么肯定是这台电脑独有的某个设置引起了这个问题。
  • 虽说不太相信,但是我还是尝试安装QT环境,该程序是在QT5的环境下开发的,在这台机子上使用国内源安装上的是QT6,而QT6并不向下兼容5,这就在编译程序的时候产生了很多报错,最终解决报错未果,遂放弃。
    • 使用国内源安装QT——Qt6安装教程——国内源
    • 即下载对应的下载器,使用powershell切换到所在文件夹,属于运行程序指令,并添加国内源后缀。例如: 使用清华源。
.\ xxx.exe --mirror http://mirrors.tuna.tsinghua.edu.cn/qt

误打误撞,开始研究防火墙设置。

  • 解决问题详见,【解决】部分。
  • 虽然问题解决了,但是有些细节还是跟我想得不一样。后续经过调试,发现,貌似改变一些设置后,每次打开该软件,会在列表中又出现一个。

  • 还有就是,我觉得仅仅勾选专用网络即可,但是发现并不行,还得勾上公用网络。相比与公用网络,专用网络拥有更高的权限。

  • 当然正如【解决】中所说,如果还是出现问题,那么直接把防火墙关闭,是最终解决办法。

总结

  • 在解决问题的时候需要理清思路,想想产生问题的可能。可能有些想法会一闪而过,如果可以的话记下来也不错。