简体   繁体   中英

C++ Closing Socket to initiate new connection

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM