私はC++プロジェクトを開発中です。要件の1つを満たすために、ポートがいつでもアプリケーションで使用できるかどうかを確認する必要があります。これを実現するために、私はこの解決策に来ました。ここでC++を使用してlinuxで使用できるポートがあるかどうかを調べる
#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 $4}' | 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
機能は、いつでも任意のシェルコマンドをexcuteことができ、戻り文字列としてstdout
出力を返すことができます。
そして、私はその機能で次のシェルコマンドを実行しています。ポートが既に使用中である場合
netstat -lntu | awk '{print $4}' | grep ':' | cut -d \":\" -f 2 | sort | uniq | grep portToCheck
ので、_executeShellCommand
はPortValue自身を返し、そうでなければ、空白が返されます。返された文字列をチェックすることで、私は決めることができます。
これまでのところとても良いです。
今、私は自分のプロジェクトを完全にクラッシュプルーフにしたいと思っています。だから、netstat
コマンドを実行する前に、本当に存在するかどうかを確認したい。私はこの場合に助けが必要です。私は知っている、それはLinuxマシンでnetstat
コマンドの可用性を疑うのは馬鹿だ。何らかの理由で自分のマシンからnetstat
バイナリを削除したユーザーを考えているだけです。
N.B. :私はポートが利用可能であるかどうかチャックにbind()
コールをしたくありません。また、_executeShellCommand
を別の時間(つまり、別のシェルコマンドを実行しないで)呼び出すことなく、netstat
コマンドが利用可能かどうかを確認することができます。
あなたは 'whereisはのnetstat'かそこらのように使用し、出力を確認することができ、よりコマンドがあります。 –
チェックと使用する間にポートが利用できなくなるケースを処理する必要があることに注意してください。コンテキストに応じて、それが利用可能であることを確認することは役に立たないか、チェックしたい時にポートの所有権を取る方が良いでしょう。 – AProgrammer
'bind()'を使わない特別な理由はありますか? – karastojko