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

相关推荐
せいしゅん青春之我23 分钟前
【JavaEE初阶】网络原理——TCP报文结构、确认应答机制
网络·笔记·网络协议·tcp/ip·java-ee
☆璇2 小时前
【Linux】数据链路层
linux·服务器·网络
电鱼智能的电小鱼3 小时前
基于电鱼 ARM 工控机的AI视频智能分析方案:让传统监控变得更聪明
网络·arm开发·人工智能·嵌入式硬件·算法·音视频
2501_915909064 小时前
网络调试工具推荐 Fiddler抓包工具使用教程与代理设置详解(HTTP/HTTPS配置与实战技巧)
网络·http·ios·小程序·fiddler·uni-app·webview
上去我就QWER4 小时前
深入理解 Qt 信号槽机制
qt
芙蓉王真的好15 小时前
初阶吃透:HTTP 请求行的格式(Method + URL + Version)详解
网络·网络协议·http
小武~5 小时前
嵌入式网络编程深度探索:无线网络驱动开发实战指南
网络·驱动开发
钱彬 (Qian Bin)6 小时前
项目实践6—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
人工智能·qt·fastapi·证件识别
Lhan.zzZ6 小时前
详解 QGridLayout:Qt的网格布局管理器
开发语言·qt
cmc10287 小时前
144.新工程导入原来工程的bd.tcl时原工程带有第三方自定义ip报错解决办法
服务器·网络·tcp/ip