Sockets 扫描打开的端口

Sockets 扫描打开的端口,sockets,network-programming,Sockets,Network Programming,我试图用下面的代码片段扫描我的ip上的开放端口,这需要20多分钟才能完成,但我需要在不到一分钟内完成。如果有人能给我一个主意,我非常感激。提前谢谢 - (void)scanForOpenPorts { struct hostent *host; int err, i, sock; char hostname[100] = "192.168.1.17"; struct sockaddr_in sa; //Initialise the sockaddr_in

我试图用下面的代码片段扫描我的ip上的开放端口,这需要20多分钟才能完成,但我需要在不到一分钟内完成。如果有人能给我一个主意,我非常感激。提前谢谢

- (void)scanForOpenPorts
{
    struct hostent *host;
    int err, i, sock;
    char hostname[100] = "192.168.1.17";
    struct sockaddr_in sa;

    //Initialise the sockaddr_in structure
    memcpy((char*)&sa , "" , sizeof sa);
    sa.sin_family = AF_INET;

    //direct ip address, use it
    if(isdigit(hostname[0]))
    {
        printf("Doing inet_addr...");
        sa.sin_addr.s_addr = inet_addr(hostname);
        printf("Done\n");
    }
    //Resolve hostname to ip address
    else if( (host = gethostbyname(hostname)) != 0)
    {
        printf("Doing gethostbyname...");
        memcpy((char*)&sa.sin_addr , (char*)host->h_addr , sizeof sa.sin_addr);
        printf("Done\n");
    }
    else
    {
        herror(hostname);
        exit(2);
    }

    //Start the port scan loop
    printf("Starting the portscan loop : \n");

    NSLog(@"Start Time: %@", [NSDate date]);

    for(i = 0; i <= 65536; i++)
    {
        //Fill in the port number
        sa.sin_port = htons(i);
        //Create a socket of type internet
        sock = socket(AF_INET , SOCK_STREAM , 0);

        //Check whether socket created fine or not
        if(sock < 0)
        {
            perror("\nSocket");
            exit(1);
        }
        //Connect using that socket and sockaddr structure
        err = connect(sock , (struct sockaddr*)&sa , sizeof sa);

        //not connected
        if( err < 0 )
        {
            //printf("%s %-5d %s\r" , hostname , i, strerror(errno));
            fflush(stdout);
        }
        //connected
        else
        {
            printf("%-5d open\n",  i);
        }

        close(sock);
    }

    NSLog(@"End Time: %@", [NSDate date]);

    printf("\r");
    fflush(stdout);
}
-(无效)扫描开放端口
{
结构主机*主机;
内尔,我,袜子;
字符主机名[100]=“192.168.1.17”;
sa中的结构sockaddr_;
//在结构中初始化sockaddr\u
memcpy((char*)和sa,“,sa的大小);
sa.sin_family=AF_INET;
//直接ip地址,使用它
if(isdigit(主机名[0]))
{
printf(“正在添加…”);
sa.sin_addr.s_addr=inet_addr(主机名);
printf(“完成”\n);
}
//将主机名解析为ip地址
如果((主机=gethostbyname(主机名))!=0,则为else
{
printf(“正在执行gethostbyname…”);
memcpy((char*)和sa.sin_addr,(char*)host->h_addr,sa.sin_addr的大小);
printf(“完成”\n);
}
其他的
{
herror(主机名);
出口(2);
}
//启动端口扫描循环
printf(“启动端口扫描循环:\n”);
NSLog(@“开始时间:%@,[NSDate date]);

对于(i=0;i您在阻塞模式下使用套接字,并以串行方式一次测试一个端口,在
connect()上没有超时)
。因此,扫描如此大范围的端口当然需要很长时间。您需要并行化代码,以便可以同时连接到多个端口,从而减少扫描端口范围所需的时间

使用非阻塞套接字,使用
select()
poll()
或提供
connect()
超时的等效套接字(大多数平台不提供在阻塞模式下为
connect()
指定超时的方法,因此您必须遵守套接字堆栈的内部超时)

在单个工作线程中,或者至少在
select()
/
poll()
循环中,让多个套接字同时连接到不同的端口

在任何给定的时间运行有限数量的连接,以免使设备或网络负担过重。启动一些连接以开始。当任何给定的套接字连接到其当前端口后,让该线程/插槽选择下一个可用端口,根据需要关闭并重新创建其套接字,然后重试。根据需要重复此操作,直到达到p范围他已经筋疲力尽了


每次
connect()
在没有超时的情况下失败时,您可以在下一个
connect()
中重复使用同一个套接字,您不需要
close()
它。但是,如果
connect()
成功或超时失败,您必须
close()
该套接字并为下一个
connect()创建一个新的套接字

如果那是在运行代码,那么它就脱离主题了。这不是一个代码审查网站。那不是C代码!不要为非C代码添加C标记。你有C语法错误,像memcpy这样的东西没有意义;我不太相信你真的理解你在做什么。我谦恭地建议你在开始学习C之前先开始学习像这样复杂的东西。@Olaf建议应该是C…@FelixPalmen:
NSLog(@“开始时间:%@,[NSDate日期])
?无论如何,这是。OT@Olaf我已经看到了。可能是一些奇怪的预处理(比如QT的代码> MOC < /代码>——当然,你可以说这不是C++,当然,也不是)。“这属于CR”的结束原因在哪里