【问题标题】:C++ Closing Socket to initiate new connectionC ++关闭套接字以启动新连接
【发布时间】: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 哦,谢谢。

标签: c++ sockets


【解决方案1】:

显然我必须关闭每个连接之间的套接字,感谢一些程序员老兄

所以我更改了我的代码,现在我在 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 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);
        }

        }

【讨论】:

  • 在这样的情况下,为您自己的问题提供答案是非常好的。但是,就目前而言,这更像是一个评论而不是一个答案。为了使这成为一个完整的答案,您应该解释您必须更改的内容。您可以在此处的代码块中发布更改后的代码。
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多