C++关闭套接字以启动新连接

C++ Closing Socket to initiate new connection

本文关键字:连接 新连接 启动 套接字 C++      更新时间:2023-10-16

我是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 timeoutn";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeoutn";
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 Openn";
close(sock_fd);
}
else
{
std::cout << "Port closedn";
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 timeoutn";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeoutn";
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 Openn";
//close(sock_fd);
}
else
{
std::cout << "Port closedn";
//close(sock_fd);
}
}
close(sock_fd);

所以显然我必须关闭每个连接之间的插座,感谢 一些程序员伙计

所以我现在更改了我的代码,我在 for 循环中创建/关闭套接字。

示例如下:

for (int i = 0; i < 7; i++)
{
// Creating the socket
// -------------------
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 260000; //260000 = 0.26s
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set RCV timeoutn";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeoutn";
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 Openn";
// Closing the socket
close(sock_fd);
}
else
{
std::cout << "Port closedn";
// Closing the socket
close(sock_fd);
}
}