【问题标题】:setsockopt does not work in C++ (timeout set to 1s, it waits longer) [duplicate]setsockopt 在 C++ 中不起作用(超时设置为 1s,它等待更长时间)[重复]
【发布时间】:2017-07-27 13:20:45
【问题描述】:

我想用 C++ 构建一个简单的端口扫描器。但是,将套接字的超时时间设置为 1s,程序在测试下一个端口之前等待的时间会更长。我是不是做错了什么?

#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <fstream>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>

int main()
{
    int socketFileDescriptor;
    struct sockaddr_in server_address;

    for (int i=3000; i<65535; i++)
    {
        std::cout<<i<<std::endl;

        socketFileDescriptor = socket(AF_INET,SOCK_STREAM, 0);

        struct timeval tv;
        tv.tv_sec = 1;

        if (setsockopt(socketFileDescriptor, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
        {
            perror("Error");
        }

        server_address.sin_family = AF_INET;
        server_address.sin_port = htons(i);
        inet_pton(AF_INET,"212.182.24.27", &(server_address.sin_addr));

        int result = connect(socketFileDescriptor,
                             (struct sockaddr*)&server_address,sizeof(struct sockaddr));
        if (result != -1)
        {
            std::cout<<"Port: "<<i<<std::endl;
        }
        close(socketFileDescriptor);
    }
}

【问题讨论】:

  • 我注意到您没有初始化整个 timeval 结构。您至少应该将tv_usec 值清零,然后重试。在设置 tv_sec 之前,在声明时将结构初始化为零,或者显式设置每个成员。

标签: c++ sockets


【解决方案1】:

SO_RCVTIMEO,顾名思义,它设置接收超时,而不是连接超时。

要获得连接超时,您必须使用非阻塞模式和select()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2019-07-05
    • 2018-02-12
    • 2014-05-19
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多