这里有两个选择。
如果你真的想检查端口是否被使用,只需尝试绑定:
bool port_in_use(unsigned short port) {
using namespace boost::asio;
using ip::tcp;
io_service svc;
tcp::acceptor a(svc);
boost::system::error_code ec;
a.open(tcp::v4(), ec) || a.bind({ tcp::v4(), port }, ec);
return ec == error::address_in_use;
}
Run Code Online (Sandbox Code Playgroud)
现场观看:Live On Coliru,正确打印
Port 1078 is in use
Run Code Online (Sandbox Code Playgroud)
注意可能还有其他原因导致您无法绑定到本地端点;首先检查您是否具有所需的权限(权限错误在这里被吞下)
如果您确实想检查连接是否被接受,则必须建立连接。这可能会更耗时,因此您可能希望在超时情况下运行它:
bool accepting_connections(unsigned short port) {
using namespace boost::asio;
using ip::tcp;
using ec = boost::system::error_code;
bool result = false;
try
{
io_service svc;
tcp::socket s(svc);
deadline_timer tim(svc, boost::posix_time::seconds(1));
tim.async_wait([&](ec) { s.cancel(); });
s.async_connect({{}, port}, [&](ec ec) {
result = !ec;
});
svc.run();
} catch(...) { }
return result;
}
Run Code Online (Sandbox Code Playgroud)
测试:
int main() {
using namespace std;
if (accepting_connections(22))
cout << "Port 22 is accepting connections\n";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6325 次 |
| 最近记录: |