设备作为tcp server和tcp client,如何绑定IP和端口号?

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();
}