ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

判断网卡是否有上网能力_V2

判断网卡是否有上网能力_V2 判断网卡是否有上网能力_V2#define IFNAMSIZ 16 int net_check_interface_tcp(const char *ifname) { const char *test_hosts[] {8.8.8.8, 223.5.5.5, 114.114.114.114, NULL}; for (int i 0; test_hosts[i] ! NULL; i) { int sockfd socket(AF_INET, SOCK_STREAM, 0); if (sockfd 0) continue; struct timeval timeout {1, 0}; setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, timeout, sizeof(timeout)); setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, timeout, sizeof(timeout)); if (ifname strlen(ifname) 0) { setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname)1); } struct sockaddr_in serv_addr {0}; serv_addr.sin_family AF_INET; serv_addr.sin_port htons(80); serv_addr.sin_addr.s_addr inet_addr(test_hosts[i]); if (connect(sockfd, (struct sockaddr*)serv_addr, sizeof(serv_addr)) 0) { close(sockfd); uvr_log_debug(zs_net net_check_interface_tcp ifname: %s is available\n, ifname); return true; } close(sockfd); } uvr_log_debug(zs_net net_check_interface_tcp ifname: %s not available\n, ifname); return false; } static int net_tcp_check(const char *ifname, const char *target_ip, unsigned short port, int timeout_ms) { int fd; int flags; int ret; int error 0; socklen_t error_len sizeof(error); struct sockaddr_in addr; struct timeval timeout; fd_set write_fds; fd socket(AF_INET, SOCK_STREAM, 0); if (fd 0) { return 0; } /* 将检测流量固定到指定网卡 */ if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname) 1) 0) { close(fd); return 0; } flags fcntl(fd, F_GETFL, 0); if (flags 0 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) 0) { close(fd); return 0; } memset(addr, 0, sizeof(addr)); addr.sin_family AF_INET; addr.sin_port htons(port); if (inet_pton(AF_INET, target_ip, addr.sin_addr) ! 1) { close(fd); return 0; } ret connect(fd, (struct sockaddr *)addr, sizeof(addr)); if (ret 0) { close(fd); return 1; } if (errno ! EINPROGRESS) { close(fd); return 0; } FD_ZERO(write_fds); FD_SET(fd, write_fds); timeout.tv_sec timeout_ms / 1000; timeout.tv_usec (timeout_ms % 1000) * 1000; ret select(fd 1, NULL, write_fds, NULL, timeout); if (ret 0) { close(fd); return 0; } ret getsockopt(fd, SOL_SOCKET, SO_ERROR, error, error_len); close(fd); return ret 0 error 0; } int net_check_interface_ping(const char *ifname) { static const struct { const char *ip; unsigned short port; } targets[] { { 223.5.5.5, 53 }, { 8.8.8.8, 53 }, { 1.1.1.1, 443}, }; if (ifname NULL || ifname[0] \0 || strlen(ifname) IFNAMSIZ) { return 0; } for (size_t i 0; i sizeof(targets) / sizeof(targets[0]); i) { if (net_tcp_check(ifname, targets[i].ip, targets[i].port, 1000)) { uvr_log_debug(net_check_interface: %s available\n, ifname); return true; } } uvr_log_debug(net_check_interface: %s unavailable\n, ifname); return false; } int net_check_interface_online(const char *ifname) { // 通过尝试与多个公共 DNS 服务器建立 TCP 连接端口 80来验证指定网络接口是否能够正常访问互联网 if (net_check_interface_tcp(ifname)) { return NET_STATUS_CONNECTED; } // TCP连接失败继续判断 if (net_check_interface_ping(ifname)) { return NET_STATUS_CONNECTED; } return NET_STATUS_DISCONNECTED; } // 调用示例 net_check_interface_online(eht0); net_check_interface_online(wlan0);
返回列表