【发布时间】:2020-06-08 17:31:17
【问题描述】:
我是 C++ 套接字编程的新手。 我制作了一个简单的端口扫描器,它扫描一个端口,它按预期工作。
现在我正在尝试扫描多个端口,因此我创建了一个套接字并开始迭代一组端口,但所有端口都显示为已关闭。
我的问题是:我必须关闭套接字才能扫描另一个端口吗?
代码如下:
// This Code scan correctly
// ------------------------
for (int i = 0; i < 7; i++)
{
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 260000; //750000 = 0.75s
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set RCV timeout\n";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeout\n";
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(ports[i]);
inet_pton(AF_INET, "192.168.100.1", &srv_addr.sin_addr.s_addr);
int connection_result = connect(sock_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
if(connection_result == 0)
{
std::cout << "Port Open\n";
close(sock_fd);
}
else
{
std::cout << "Port closed\n";
close(sock_fd);
}
}
但是这段代码我在for循环之外创建/关闭套接字显示所有端口都关闭了!
// Shows all ports close
// ----------------------
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
for (int i = 0; i < 7; i++)
{
//int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100000; //750000 = 0.75s
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set RCV timeout\n";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeout\n";
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(ports[i]);
inet_pton(AF_INET, "192.168.100.1", &srv_addr.sin_addr.s_addr);
int connection_result = connect(sock_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
if(connection_result == 0)
{
std::cout << "Port Open\n";
//close(sock_fd);
}
else
{
std::cout << "Port closed\n";
//close(sock_fd);
}
}
close(sock_fd);
【问题讨论】:
-
请不要使用术语“C/C++”或标记两种语言。它们是两种截然不同且非常不同的语言,您很可能只使用其中一种编程,而不是同时使用两种语言。
-
@Someprogrammerdude 好的,我更新了问题
-
至于你的问题,答案是:是的,连接之间必须关闭socket。
-
@Someprogrammerdude 哦,谢谢。