gpt4 book ai didi

C++ 检查 TCP 端口

转载 作者:可可西里 更新时间:2023-11-01 16:27:21 26 4
gpt4 key购买 nike

我用 C++ 写了一个程序,我需要检查 TCP 端口是否真的是空的。

这是函数:

int checkport(char* host, char* port, int timeout)
{
int sock;
struct sockaddr_in sin;
int result = 0;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(port));
sin.sin_addr.s_addr = inet_addr(host);
fd_set fdset;
struct timeval tv;
fcntl(sock, F_SETFL, O_NONBLOCK);

int connect_result = connect(sock,(struct sockaddr*)(&sin),sizeof(struct sockaddr_in));
FD_ZERO(&fdset);
FD_SET(sock, &fdset);
tv.tv_sec = timeout;
tv.tv_usec = 0;

int select_result = select(sock + 1, NULL, &fdset, NULL, &tv);

// printf("connect = [%d] | select = [%d]\n",connect_result,select_result);

if(select_result == 1)
{
int so_error;
socklen_t len = sizeof so_error;
getsockopt(sock, SOL_SOCKET, SO_ERROR, &so_error, &len);

// printf("so_error = [%d] \n",so_error);

if(so_error == 0)
{
//Is connected
if(hitdebug >= 4) puts("CONNECTED");
if(hitdebug >= 2) printf("[%s:%s] OPEN\n",host,port);

result = 1;
}
else
{
if(hitdebug >= 4) puts("CONNECT_ERROR_1");

result = 0;

}
}
else
{
if(hitdebug >= 4) puts("CONNECT_ERROR_2");

result = 0;
}

close(sock);

return result;
}

问题是只检测 LISTEN 端口,我希望端口 100% 真实,甚至检测 ESTABLISHED、TIME_WAIT 等...

输出:

connect = [-1] | select = [1]
so_error = [111]
50983 TEST=[0]
tcp 0 0 1.2.3.4:50983 4.4.4.4:22 ESTABLISHED


connect = [-1] | select = [1]
so_error = [111]
43343 TEST=[0]
tcp 0 0 1.2.3.4:43343 4.4.4.4:22 ESTABLISHED


connect = [-1] | select = [1]
so_error = [0]
64000 TEST=[1]
tcp 0 0 1.2.3.4:64000 0.0.0.0:* LISTEN
tcp 0 0 1.2.3.4:47669 1.2.3.4:64000 TIME_WAIT


connect = [-1] | select = [1]
so_error = [111]
54674 TEST=[0]


connect = [-1] | select = [1]
so_error = [111]
54665 TEST=[0]

对我来说,一个空端口是当我执行 netstat -an | grep 12345 | wc -l 我看到 0,甚至没有 FIN_WAIT

我怎样才能做到这一点?

谢谢。

最佳答案

if (the_port_is_free(port_number)) {
/* is the port free at this point? */
}

正确答案是“谁知道呢?”当然,当控件位于函数 the_port_is_free 中的某处时,它在一纳秒前是空闲的,但是现在它是空闲的吗?周围还有许多其他进程,也许其中一个进程在半纳秒前占用了端口?

这称为竞争条件。每个程序员都应该理解这个概念。

正是因为这个问题 the_port_is_free 不是由你的操作系统提供的:它只会给你错误的期望,而不是正确的答案。您无法知道该端口现在是否空闲,更重要的是,当您决定绑定(bind)它时,它会在一纳秒内空闲。绑定(bind)端口的唯一方法是继续尝试绑定(bind)它。

这种方法适用于很多情况。每当有任何类型的共享资源时,通常没有函数告诉您是否可以获取它。获得它的唯一方法是继续尝试。

关于C++ 检查 TCP 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com