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  绍荣  阅读(67)  评论(0)    收藏  举报