Linux下的网络端口连通性检测通常是指检查一个特定的网络端口是否开放并能够接收连接请求。这可以通过发送特定的网络请求到目标IP地址和端口来实现。在C语言中,可以使用套接字(socket)API来完成这项任务。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int check_tcp_port(const char *ip, int port) {
int sockfd;
struct sockaddr_in serv_addr;
// 创建套接字
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return -1;
}
// 设置服务器地址结构体
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
if (inet_pton(AF_INET, ip, &serv_addr.sin_addr) <= 0) {
perror("inet_pton");
close(sockfd);
return -1;
}
// 尝试连接
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
close(sockfd);
return 0; // 连接失败,端口未开放
}
close(sockfd);
return 1; // 连接成功,端口开放
}
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s<IP> <port>\n", argv[0]);
return 1;
}
const char *ip = argv[1];
int port = atoi(argv[2]);
if (check_tcp_port(ip, port)) {
printf("Port %d is open\n", port);
} else {
printf("Port %d is closed or filtered\n", port);
}
return 0;
}
select()
或poll()
函数设置超时。connect()
函数中使用非阻塞套接字,并结合select()
或poll()
进行超时处理。#include <sys/select.h>
int connect_with_timeout(int sockfd, struct sockaddr *addr, socklen_t addrlen, int timeout) {
fd_set writefds;
struct timeval tv;
// 设置非阻塞模式
fcntl(sockfd, F_SETFL, O_NONBLOCK);
if (connect(sockfd, addr, addrlen) < 0 && errno != EINPROGRESS) {
return -1;
}
// 初始化读写集合
FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);
// 设置超时时间
tv.tv_sec = timeout;
tv.tv_usec = 0;
// 等待连接完成或超时
if (select(sockfd + 1, NULL, &writefds, NULL, &tv) > 0) {
int so_error;
socklen_t len = sizeof(so_error);
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len);
if (so_error == 0) {
return 0; // 连接成功
} else {
return -1; // 连接失败
}
} else {
return -1; // 超时
}
}
通过上述方法,可以有效地检测Linux下的网络端口连通性,并解决常见的连接问题。
领取专属 10元无门槛券
手把手带您无忧上云