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号