gpt4 book ai didi

c - C++ 中的端口扫描器挂起

转载 作者:行者123 更新时间:2023-11-30 14:25:00 24 4
gpt4 key购买 nike

我在 Linux 中制作了一个简单的 C 端口扫描程序。主要算法是尝试调用connect,如果它返回-1,我无法连接,否则我连接了主机。这在我的计算机上运行良好,它列出了我的开放端口。然而,在我家里有另一台计算机(与我的同一路由器后面),我给出了它的 IP,但程序挂起。我尝试了 google.com、facebook.com 或任何其他网站,但他们甚至不响应第一个请求。我究竟做错了什么?

编辑:

for(port=0; port<=65536; port++)  
{
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(addr.sin_zero), '\0', 8);
if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) {
printf("%i closed\n", port);
close(sockfd);
}
else {
printf("%i open\n", port);
close(sockfd);
}
}

最佳答案

默认connect在返回错误之前会阻塞一段时间。您可以通过将套接字设置为非阻塞模式然后调用 connect 来选择更短的超时 select有超时。

这方面的例子有很多。本教程关于nonblocking套接字非常清楚。或参见OsNetworkConnect举个我之前写的例子。

您尝试连接到外部站点上的任意端口可能会被故意阻止(系统管理员不鼓励端口扫描程序!)。

另请注意,您的循环条件稍有偏差。您应该在端口 65535 处终止。65536 无法用 16 位表示。

关于c - C++ 中的端口扫描器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10861345/

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