QT 1.QTcpSocket

1 连接samba服务器

在Ubuntu中,利用Samba服务器实现在网络中文件共享和打印共享,之后不同的主机之间就可以实现共享文件的操作,感觉别的系统上的文件就像在自己系统上一样方便

  • IsHostAvailable(): 能连接Samba服务器,之后说明可以文件共享和打印共享

1.1 QTcpSocket连接

QTcpSocket tcpClient;
tcpClient.setProxy(QNetworkProxy::NoProxy);
//Port 139 (TCP) - 文件和打印共享;smbd(基于SMB(Server Message Block)协议,主要在局域网中使用,文件共享协议)
int smbd_port = 139;
int trial_count = 2;
while (trial_count > 0) {
tcpClient.abort();
tcpClient.connectToHost(SystemSettingDataModel::Instance()->GetIpAddress(), smbd_port);
//usb导入大程序时,导致连接失败,加长连接时间
//ARCS的CPU使用率过高时,连接samba端口失败,导致锁屏
//从HMI拷贝文件到ARCS时,偶发连接samba失败,挂载失败
//打开参数配置页面,出现网络连接失败
bool ret = tcpClient.waitForConnected(3000);
if (ret) {
tcpClient.disconnect();
return true;
}
--trial_count;
}
return false;

你提供的这段代码主要实现了一个使用 QTcpSocket 尝试连接到指定 IP 地址的 SMB 服务端口(端口号为 139)的功能。如果连接成功,则断开连接并返回 true;如果在两次尝试内都未能成功连接,则返回 false。下面为你详细分析这段代码,并给出一些优化建议。

1.1 代码分析

  1. 创建 QTcpSocket 对象并设置代理

    QTcpSocket tcpClient;
    tcpClient.setProxy(QNetworkProxy::NoProxy);

  • 创建了一个 QTcpSocket 对象 tcpClient,用于进行 TCP 连接。
  • 设置不使用代理,确保直接连接目标主机。
  1. 定义端口号和尝试次数

    int smbd_port = 139;
    int trial_count = 2;

  • smbd_port 定义了要连接的 SMB 服务的端口号为 139。
  • trial_count 定义了最大尝试连接次数为 2 次。
  1. 循环尝试连接

    while (trial_count > 0) {
    tcpClient.abort();
    tcpClient.connectToHost(SystemSettingDataModel::Instance()->GetIpAddress(), smbd_port);
    bool ret = tcpClient.waitForConnected(3000);
    if (ret) {
    tcpClient.disconnect();
    return true;
    }
    --trial_count;
    }

  • tcpClient.abort():在每次尝试连接之前,先中止当前可能存在的连接,确保以全新的状态进行连接。
  • tcpClient.connectToHost():尝试连接到指定 IP 地址的 SMB 服务端口。
  • tcpClient.waitForConnected(3000):等待连接操作完成,最多等待 3000 毫秒(即 3 秒)。如果在 3 秒内连接成功, waitForConnected() 函数返回 true,否则返回 false。
  • 如果连接成功(ret 为 true),则调用 tcpClient.disconnect() 断开连接,并返回 true。
  • 如果连接失败,则将尝试次数减 1,继续下一次尝试
  1. 返回结果

    return false;

  • 如果两次尝试都未能成功连接,则返回 false。

1.1.2 优化建议

  1. 错误处理和日志记录

在连接失败时,可以添加错误处理和日志记录,以便更好地调试和排查问题。例如:

while (trial_count > 0) {
tcpClient.abort();
tcpClient.connectToHost(SystemSettingDataModel::Instance()->GetIpAddress(), smbd_port);
bool ret = tcpClient.waitForConnected(3000);
if (ret) {
tcpClient.disconnect();
return true;
} else {
qDebug() << "Connection failed: " << tcpClient.errorString();
}
--trial_count;
}

  1. 异常处理

可以添加对 SystemSettingDataModel::Instance()->GetIpAddress() 的异常处理,确保获取的 IP 地址是有效的。例如:

QString ipAddress = SystemSettingDataModel::Instance()->GetIpAddress();
if (ipAddress.isEmpty()) {
qDebug() << "Invalid IP address.";
return false;
}

  1. 超时时间可配置

将超时时间(3000 毫秒)作为一个常量或参数,方便后续调整。例如:

const int CONNECTION_TIMEOUT = 3000;
// ...
bool ret = tcpClient.waitForConnected(CONNECTION_TIMEOUT);

通过以上优化,可以提高代码的健壮性和可维护性。

2 smb服务器的port一般设置多少,是139吗?

SMB 服务器常用的端口有139和445。

  • 139 端口:在较老的 Windows 系统和早期的 SMB 协议版本中,常使用 139 端口进行通信。它基于 NetBIOS 协议,主要用于在局域网中实现文件和打印共享等功能。
  • 445 端口:随着技术的发展,445 端口逐渐成为 SMB 协议的主要端口。它直接使用 TCP 协议,相比基于 NetBIOS 的 139 端口,具有更好的性能和安全性,并且在广域网环境中也能更好地工作。现在的 Windows 系统和大多数现代 SMB 服务器默认使用 445 端口进行 SMB 通信。

在实际应用中,SMB 服务器的端口设置可以根据具体需求和网络环境进行调整。有些情况下,为了避免端口冲突或出于安全考虑,管理员可能会将 SMB 服务器配置为使用其他端口。

posted @ 2025-03-21 10:45  绍荣  阅读(124)  评论(0)    收藏  举报