获取正在监听的主机列表

本文介绍了一种使用C++进行网络编程的方法,通过net_utility类实现对指定域名和端口的监听主机列表获取。代码中包含了信号处理、套接字创建、地址解析、连接尝试及地址转换等关键步骤,适用于需要在网络环境中获取监听主机信息的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <signal.h>
#include <iostream>
#include <string>
#include <vector>
class net_utility {
public:
    static void listened_host_list(const char *domain, const char *port, std::vector<std::string>&host_list) {
        signal(SIGPIPE, SIG_IGN);
        addrinfo *result = nullptr;
        addrinfo hints = { 0 };
        hints.ai_family = AF_UNSPEC;            // either IPv4 or IPv6
        hints.ai_socktype = SOCK_STREAM; 
        if (0 != getaddrinfo(domain, port, &hints, &result)) {
            std::cerr << "getaddrinfo for domain:" << domain << " port:" << port << "failed." << std::endl;
            return;
        }
        char address[INET6_ADDRSTRLEN] = "";
        const char *retval = nullptr;
        struct timeval timeo = {10, 0};         // 10s
        socklen_t len = sizeof(timeo);
        for (auto addr = result;addr != nullptr;addr = addr->ai_next) {      
            int client_fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);  
            if (client_fd < 0) {
                continue;
            }
            setsockopt(client_fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);
            if (connect(client_fd, addr->ai_addr, addr->ai_addrlen) < 0) {
                std::cerr << "connect failed." << std::endl;
                close(client_fd);
                continue;
            }
            switch(addr->ai_family) {
                case AF_INET:
                    retval = inet_ntop(addr->ai_family, &(reinterpret_cast<sockaddr_in *>(addr->ai_addr)->sin_addr), address, INET6_ADDRSTRLEN);
                    break;
                case AF_INET6:
                    retval = inet_ntop(addr->ai_family, &(reinterpret_cast<sockaddr_in6 *>(addr->ai_addr)->sin6_addr), address, INET6_ADDRSTRLEN);
                    break;
                default:
                    retval = nullptr;
                    break;
            }
            host_list.emplace_back(address);
            close(client_fd);
        }
        freeaddrinfo(result);
    }
};
int main(){
    const char *ip = "192.168.2.109";
    const char *port = "26311";
    std::vector<std::string>host_list;
    net_utility::listened_host_list(ip, port, host_list);
    for (auto &host : host_list) {
        std::cout << host << " is listening" << std::endl;
    }

    return 0;
}

 

Node Exporter 可以通过收集系统内核网络和文件句柄的信息来获取主机监听端口信息。具体来说,Node Exporter 会读取 `/proc/net/tcp` 和 `/proc/net/tcp6` 文件来获取 TCP 监听端口的信息,同时也会读取 `/proc/net/udp` 和 `/proc/net/udp6` 文件来获取 UDP 监听端口的信息。 Node Exporter 收集到的端口信息会作为 `node_network_*` 和 `node_filehandle_*` 系列指标的一部分,其中 `node_network_*` 指标包含 TCP 和 UDP 监听端口的信息,而 `node_filehandle_*` 指标包含每个进程打开的文件句柄数量信息。 例如,可以使用以下命令来列出 Node Exporter 收集到的所有网络相关的指标信息: ``` curl http://node-exporter-ip:9100/metrics | grep node_network ``` 您将看到类似于以下内容的输出: ``` # HELP node_network_address_translation_table_entries Number of address translation table entries. # TYPE node_network_address_translation_table_entries gauge node_network_address_translation_table_entries 0 # HELP node_network_active_opens Number of times TCP connections have made a direct transition to the SYN-SENT state from the CLOSED state. # TYPE node_network_active_opens gauge node_network_active_opens 5 # HELP node_network_attempt_fails Number of times TCP connections have made a direct transition to the CLOSED state from either the SYN-SENT state or the SYN-RCVD state, plus the number of times TCP connections have made a direct transition to the LISTEN state from the SYN-RCVD state. # TYPE node_network_attempt_fails gauge node_network_attempt_fails 0 ... ``` 其中 `node_network_*` 指标中的 `local_address` 和 `local_port` 字段表示监听的本地IP地址和端口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值