1、设备作为tcp client: 本地端口号由系统随机分配,若有多张网卡,IP可强制绑定到指定网卡。
cpp
#include <QModbusTcpClient>
#include <QTcpSocket>
#include <QHostAddress>
QModbusTcpClient *modbusClient = new QModbusTcpClient(this);
// 获取底层TCP socket
QTcpSocket *socket = qobject_cast<QTcpSocket*>(modbusClient->socket());
if (socket)
{
// 绑定本地网口1 IP,本地端口由系统自动分配(第二个参数传0)
bool bindRet = socket->bind(QHostAddress("192.168.1.100"), 0);
if (!bindRet)
{
qDebug() << "本地网卡绑定失败:" << socket->errorString();
}
}
// 再去连接远端Modbus服务端(远端IP:502)
modbusClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.200");
modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
modbusClient->connectDevice();
本地端口填 0:系统自动分配空闲临时端口,避免端口冲突; 只绑定本地 IP,绝对不要客户端绑定本地 502 端口。
2、设备作为tcp server,必须绑定指定网口 IP 192.168.1.100 + 端口 502,才能让 Modbus TCP 服务只在指定网口监听。
- 如果不指定具体 IP,使用
QHostAddress::Any监听,程序会在本机所有网卡(网口 1、网口 2 等)的 502 端口同时监听,任意网卡 IP 都能访问你的 Modbus 服务。 - 你只想让外部只能通过网口 1(
192.168.1.100)访问 Modbus 服务,就必须在listen里明确传入该 IP+502 端口,此时其他网卡的 IP 无法连接到这个 Modbus 服务。
cpp
#include <QModbusTcpServer>
#include <QHostAddress>
QModbusTcpServer *modbusServer = new QModbusTcpServer(this);
// 绑定网口1:192.168.1.100 端口502
bool ret = modbusServer->listen(QHostAddress("192.168.1.100"), 502);
if(ret)
{
qDebug() << "Modbus服务启动成功,仅监听192.168.1.100:502";
}
else
{
qDebug() << "启动失败:" << modbusServer->errorString();
}