使用 C++ 查找端口是否可用于 linux
Find if a port is available to use in linux using c++
我正在做一个 C++ 项目。为了满足其中一项要求,我需要随时检查某个端口是否可用于我的应用程序。为了实现这一点,我提出了以下解决方案。
#include <iostream>
#include <cstdlib>
#include <stdexcept>
#include <string>
#include <stdio.h>
std::string _executeShellCommand(std::string command) {
char buffer[256];
std::string result = "";
const char * cmd = command.c_str();
FILE* pipe = popen(cmd, "r");
if (!pipe) throw std::runtime_error("popen() failed!");
try {
while (!feof(pipe))
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
} catch (...) {
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
bool _isAvailablePort(unsigned short usPort){
char shellCommand[256], pcPort[6];
sprintf(shellCommand, "netstat -lntu | awk '{print }' | grep ':' | cut -d \":\" -f 2 | sort | uniq | grep %hu", usPort);
sprintf(pcPort, "%hu", usPort);
std::string output = _executeShellCommand(std::string(shellCommand));
if(output.find(std::string(pcPort)) != std::string::npos)
return false;
else
return true;
}
int main () {
bool res = _isAvailablePort(5678);
return 0;
}
这里 基本上 _executeShellCommand
函数可以随时执行任何 shell 命令并且可以 return stdout
输出为 return 字符串。
我正在该函数中执行以下 shell 命令。
netstat -lntu | awk '{print }' | grep ':' | cut -d \":\" -f 2 | sort | uniq | grep portToCheck
因此,如果端口已被使用,_executeShellCommand
将 return PortValue 本身,否则它将 return 空白。所以,检查 returned 字符串,我可以决定。
到目前为止一切顺利。
现在,我想让我的项目完全防崩溃。所以,在触发 netstat
命令之前,我想确定它是否真的存在。在这种情况下我需要帮助。我知道,怀疑 linux 机器中 netstat
命令的可用性有点愚蠢。我只是想到一些用户出于某种原因从他的机器中删除了 netstat
二进制文件。
N.B。 : 我不想调用 bind()
来检查端口是否可用。此外,如果我可以检查 netstat
命令是否可用而无需再次调用 _executeShellCommand
(即不执行另一个 Shell 命令),那将是最好的。
一个更好的主意是让您的代码在完全没有 netstat
的情况下完全工作。
在 Linux 上,netstat
所做的一切(对于您的用例)都是读取 /proc/net/tcp
的内容,其中列举了所有正在使用的端口。
您所要做的就是自己打开 /proc/net/tcp
并解析它。这只是一个普通的、无聊的文件解析代码。没有比这更多的 "crash-proof" 了。
您将在 Linux 手册页中找到 /proc/net/tcp
格式的文档。
万一您需要检查 UDP
个端口,这将是 /proc/net/udp
。
当然,在您检查 /proc/net/tcp
之间存在竞争 window,有人可以抢占端口。但是 netstat
也是如此,因为这将是一个更慢的过程,这实际上是一个改进,并显着减少比赛 window。
由于您要求的是检查 netstat
命令是否可用的方法,因此我不会尝试建议 C++ 中的其他方法。 shell 方法正在检查以下命令的 return 代码:
command -v netstat
如果 netstat
二进制文件在 $PATH
中可用,则命令 returns 0
。在 Bash 中通常是这样的:
command -v netstat
if [ $? -eq 0 ]; then
netstat # ...
else
echo >&2 "Error: netstat is not available"
fi
或者干脆
command -v netstat >/dev/null && netstat # ...
我正在做一个 C++ 项目。为了满足其中一项要求,我需要随时检查某个端口是否可用于我的应用程序。为了实现这一点,我提出了以下解决方案。
#include <iostream>
#include <cstdlib>
#include <stdexcept>
#include <string>
#include <stdio.h>
std::string _executeShellCommand(std::string command) {
char buffer[256];
std::string result = "";
const char * cmd = command.c_str();
FILE* pipe = popen(cmd, "r");
if (!pipe) throw std::runtime_error("popen() failed!");
try {
while (!feof(pipe))
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
} catch (...) {
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
bool _isAvailablePort(unsigned short usPort){
char shellCommand[256], pcPort[6];
sprintf(shellCommand, "netstat -lntu | awk '{print }' | grep ':' | cut -d \":\" -f 2 | sort | uniq | grep %hu", usPort);
sprintf(pcPort, "%hu", usPort);
std::string output = _executeShellCommand(std::string(shellCommand));
if(output.find(std::string(pcPort)) != std::string::npos)
return false;
else
return true;
}
int main () {
bool res = _isAvailablePort(5678);
return 0;
}
这里 基本上 _executeShellCommand
函数可以随时执行任何 shell 命令并且可以 return stdout
输出为 return 字符串。
我正在该函数中执行以下 shell 命令。
netstat -lntu | awk '{print }' | grep ':' | cut -d \":\" -f 2 | sort | uniq | grep portToCheck
因此,如果端口已被使用,_executeShellCommand
将 return PortValue 本身,否则它将 return 空白。所以,检查 returned 字符串,我可以决定。
到目前为止一切顺利。
现在,我想让我的项目完全防崩溃。所以,在触发 netstat
命令之前,我想确定它是否真的存在。在这种情况下我需要帮助。我知道,怀疑 linux 机器中 netstat
命令的可用性有点愚蠢。我只是想到一些用户出于某种原因从他的机器中删除了 netstat
二进制文件。
N.B。 : 我不想调用 bind()
来检查端口是否可用。此外,如果我可以检查 netstat
命令是否可用而无需再次调用 _executeShellCommand
(即不执行另一个 Shell 命令),那将是最好的。
一个更好的主意是让您的代码在完全没有 netstat
的情况下完全工作。
在 Linux 上,netstat
所做的一切(对于您的用例)都是读取 /proc/net/tcp
的内容,其中列举了所有正在使用的端口。
您所要做的就是自己打开 /proc/net/tcp
并解析它。这只是一个普通的、无聊的文件解析代码。没有比这更多的 "crash-proof" 了。
您将在 Linux 手册页中找到 /proc/net/tcp
格式的文档。
万一您需要检查 UDP
个端口,这将是 /proc/net/udp
。
当然,在您检查 /proc/net/tcp
之间存在竞争 window,有人可以抢占端口。但是 netstat
也是如此,因为这将是一个更慢的过程,这实际上是一个改进,并显着减少比赛 window。
由于您要求的是检查 netstat
命令是否可用的方法,因此我不会尝试建议 C++ 中的其他方法。 shell 方法正在检查以下命令的 return 代码:
command -v netstat
如果 netstat
二进制文件在 $PATH
中可用,则命令 returns 0
。在 Bash 中通常是这样的:
command -v netstat
if [ $? -eq 0 ]; then
netstat # ...
else
echo >&2 "Error: netstat is not available"
fi
或者干脆
command -v netstat >/dev/null && netstat # ...