使用QT做网络调试助手心得

TCP协议在局域网中一般没什么问题

客户端使用

cpp 复制代码
client->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());

连接服务端

客户端的IP地址确定方式取决于网络环境和应用场景,以下是关键要点总结:

1. ‌操作系统自动分配

  • 默认行为‌:客户端发起连接时,操作系统会根据本地网络配置自动选择源IP地址,无需手动指定
  • 路由决策‌:系统基于目标服务器IP的路由表选择对应出口网卡,自动绑定该网卡IP为源地址

客户端在多网卡时它会自动选择合适的源IP

但是UDP就不一样了,如果你UDP这样子分配源IP

cpp 复制代码
udpSocket->bind(QHostAddress(QHostAddress::Any),0);  // 0表示自动分配端口

它会随机在众多网卡IP中给你分配一个,如果刚好分配到的这个IP地址与目的IP不在一个网络下,那就不能进行通信了。

默认不会,Windows本身不是一个正常的路由器 ,即使开启了Internet Connection Sharing(ICS)或NAT,它默认也不处理来自WAN发向LAN的"本地目标"的流量,除非配置端口映射(NAT规则())。

(可以自行通过网络结构来判断)

例子:

根据你提供的网络信息,我们分析一下:


网络结构概述:

  • Linux设备:

    • IP:192.168.20.66(假设它在192.168.20.0/24子网内)
  • Windows电脑:

    • WAN口 IP:192.168.31.2(连接上级路由器)

    • LAN口 IP:192.168.20.1(给下级网络提供DHCP/NAT服务)

  • Linux和Windows之间的连接:

    • Linux通过连接到 Windows 的 LAN 网段(192.168.20.0/24)通信。

你的问题是:

Windows发送一个数据包,源地址是192.168.31.2目的地址是192.168.20.66,能否送达到Linux?


答案:

不能直接送达到 Linux,除非 Windows 做了特殊路由或NAT配置。


原因分析:

  • Windows 的 源地址是192.168.31.2 ,也就是说这个数据包是从 Windows 的WAN口 发出来的。

  • 目的地址是192.168.20.66,这是在 Windows 的LAN口(192.168.20.1)下面的设备。

  • 正常情况下,Windows 不会把发往 LAN 的流量从 WAN 发出,尤其是当源地址不是 LAN 内地址时。


更具体的问题点:

  1. Linux是否能接收到发往自己的数据包?

    • 是,如果数据包 确实从192.168.20.x网络进入,且目标是192.168.20.66。

    • 否,如果数据包从 上级网络192.168.31.0/24 发出,Linux 设备(在192.168.20.0/24)不会收到它 ,除非中间网关(即Windows电脑)做了 DNAT 或路由设置,并且允许这样的"回流"。

  2. Windows是否会转发192.168.31.2 → 192.168.20.66的数据包?

    • 默认不会,Windows本身不是一个正常的路由器 ,即使开启了Internet Connection Sharing(ICS)或NAT,它默认也不处理来自WAN发向LAN的"本地目标"的流量,除非配置端口映射(NAT规则)。它看到不是自己网段的就直接丢到wan口(即电脑网口里)了,不像路由器还可以转发到下级,除非你特别做映射。

      默认情况是单向 NAT 映射:
    • Linux 向外访问(例如 ping 192.168.31.5):

      • Windows 做 SNAT(源地址转换),将 Linux 发出的包源地址改为 192.168.31.2;

      • 对端设备会把响应包发回给 192.168.31.2;

      • Windows 根据 NAT 表转发给 Linux;

      • 通信成功,单向是通的。

    • 反过来,如果外部(192.168.31.x)主动访问 Linux 的 IP(192.168.20.66)

      • ❌ 默认是不通的!因为 Windows 没有为这个目标做 DNAT(目标地址转换)或端口映射。

      • NAT网关(Windows)并不知道要把这个流量转发给 LAN 中的哪个主机。


解决办法(如果你想让Linux接收到来自Windows WAN口的数据):

✅ 方案1:在Windows上做NAT/端口转发(推荐)
  • 在 Windows 上配置如下规则(假设你要访问Linux的SSH服务):

    复制代码
    netsh interface portproxy add v4tov4 listenport=2222 listenaddress=192.168.31.2 connectport=22 connectaddress=192.168.20.66
  • 这样,在访问 192.168.31.2:2222 时,Windows会把请求转发到 192.168.20.66:22

✅ 方案2:从上级路由器转发数据到Windows的LAN设备
  • 如果数据包原本在 192.168.31.0/24 发出,需要中间的 Windows 做桥接或设置静态路由才能让其送达 Linux。

✅ 总结:

情况 能否送达? 备注
Windows从LAN口发送(源地址192.168.20.1) ✅ 能 Linux和Windows同网段
Windows从WAN口(源地址192.168.31.2)发往Linux LAN网段 ❌ 默认不能 除非做了端口映射/NAT
配置端口转发后从192.168.31.2发往Linux ✅ 能 Windows做转发代理

如你想实现某个特定服务访问或配置具体 NAT 转发规则,可以告诉我目标端口或访问方式,我可以给出具体的命令或设置指导。

相关推荐
andxe5 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一6 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
DFT计算杂谈6 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
水境传感 李兆栋6 小时前
GNSS 位移监测站 :毫米级感知,筑牢安全监测防线
网络
中微极客8 小时前
2026主流AI Agent框架技术选型与性能对比
运维·网络·人工智能
mabing9939 小时前
Qt 生成条纹图
开发语言·qt
Fu_Lin_9 小时前
Qt 嵌入式从零基础到精通总纲
开发语言·qt·嵌入式·qt嵌入式
茯苓gao11 小时前
嵌入式开发笔记:Qt信号槽机制深度解析——从原理到实战的全方位指南
开发语言·笔记·嵌入式硬件·qt·学习
布朗克16811 小时前
Go 入门到精通-31-编码与序列化
开发语言·qt·golang·编码与序列化
猿的天空12 小时前
机器人双手迎来全栈训练系统:灵初智能EgoSteer让灵巧手无所不能
网络·人工智能·计算机·ai·程序员·机器人·编程