- 系统: win10
- IDE: QT(Qt Quick)
简介
在做通讯软件练习时,想给当前客户端
bind
端口号,又不想直接手动写死,于时想到一个办法。先获取电脑当前所有被占用的端口号,然后再从1025~65535
之间随机选择一个,并进行是否被占用的确认。
代码
/**
* @brief getFreePort:获取非空闲的UDP端口号
* @return
*/
inline static QList<quint16> getFreePort()
{
QList<quint16> qlist_Port;
QProcess pro;
pro.start("netstat -nao");
pro.waitForStarted(); //等待程序开始
pro.waitForFinished(); //等待程序结束
QString str(pro.readAllStandardOutput().data());
QStringList strList = str.split("\n",QString::SkipEmptyParts);
for(int i = 0; i < strList.count(); ++i)
{
QString strTemp(strList[i]);
if(strTemp.contains("UDP") && !strTemp.contains("]:"))
{
strTemp = strTemp.remove(QRegExp("\\s"));//去除所有空格
int indexR = strTemp.indexOf("*:*");
int indexL = strTemp.indexOf(":");
strTemp = strTemp.mid(indexL + 1,indexR - indexL - 1);
qlist_Port.push_back(strTemp.toUInt());
}
}
return qlist_Port;
}
/**
* @brief getRandomPort:获取一个1025~65535之间的数字作为端口号
* @return
*/
inline static quint16 getRandomPort()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
quint16 s = qrand() % 65535;
return s >= 1025 ? s : getRandomPort();
}