I am new to socket programming in C++. I've made a simple port scanner that scan one port and it worked as expected.
Now I'm trying to scan multiple ports So I create a socket and started iterating over an array of ports, BUT all ports appears as closed.
My Question is: Do i have to close socket in order to scan another port?
Code is bellow:
// 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);
}
}
But this code where i create/close socket outside the for loop shows all ports as closed!
// 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);
So apparently i must close the socket between each connection, Thanks to Some programmer dude
So I changed my code now I create/close socket inside the for loop.
Example below:
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 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";
// Closing the socket
close(sock_fd);
}
else
{
std::cout << "Port closed\n";
// Closing the socket
close(sock_fd);
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.