使用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 转发规则,可以告诉我目标端口或访问方式,我可以给出具体的命令或设置指导。

相关推荐
海域云赵从友22 分钟前
中泰制造企业组网新方案:中-泰企业国际组网专线破解泰国工厂访问国内 OA/ERP 卡顿难题
网络
灵性花火2 小时前
Qt + C++ 入门2(界面的知识点)
开发语言·c++·qt
heart000_12 小时前
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
网络·云原生·容器·kubernetes
杰克逊的日记3 小时前
什么是RoCE网络技术
运维·服务器·网络·roce
小灰灰搞电子3 小时前
QVariant详解与属性访问
qt·qvariant
极地星光4 小时前
Qt/C++应用:防御性编程完全指南
开发语言·c++·qt
卖猪肉的痴汉6 小时前
5.2 Qt Creator 使用FFmpeg库
开发语言·qt·ffmpeg
Jackilina_Stone7 小时前
【网工】华为配置专题进阶篇④
网络·华为·网工
谷雪_6588 小时前
学习华为 ensp 的学习心得体会
网络·学习·华为·网络工程·ensp
zh4men99 小时前
Mac Parallels Desktop Kali 2025 代理设置
服务器·网络·macos·kali·pdesktop