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 代码分析
- 
创建 QTcpSocket 对象并设置代理 QTcpSocket tcpClient; tcpClient.setProxy(QNetworkProxy::NoProxy);
- 创建了一个 QTcpSocket 对象 tcpClient,用于进行 TCP 连接。
- 设置不使用代理,确保直接连接目标主机。
- 
定义端口号和尝试次数 int smbd_port = 139; int trial_count = 2;
- smbd_port 定义了要连接的 SMB 服务的端口号为 139。
- trial_count 定义了最大尝试连接次数为 2 次。
- 
循环尝试连接 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,继续下一次尝试
- 
返回结果 return false;
- 如果两次尝试都未能成功连接,则返回 false。
1.1.2 优化建议
- 错误处理和日志记录
在连接失败时,可以添加错误处理和日志记录,以便更好地调试和排查问题。例如:
    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;
    }
- 异常处理
可以添加对 SystemSettingDataModel::Instance()->GetIpAddress() 的异常处理,确保获取的 IP 地址是有效的。例如:
    QString ipAddress = SystemSettingDataModel::Instance()->GetIpAddress();
    if (ipAddress.isEmpty()) {
        qDebug() << "Invalid IP address.";
        return false;
    }
- 超时时间可配置
将超时时间(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 服务器配置为使用其他端口。
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号