winsock阻塞扫描死在那了?解决方法

winsock阻塞扫描死在那了?
C/C++ code

#include "winsock2.h"
#include "stdio.h"
#include <stdlib.h>

#pragma comment(lib,"ws2_32")

void main()
{
    WSADATA wsaData;
    SOCKET s;
    SOCKADDR_IN ServerAddr;
    int n,ret;

    char Cipna[20]="207.182.253.40";
    long Port,Port1,Port2;

//    printf("需要进行扫描的ip为:");
//    scanf("%s",Cipna);
    
    printf("需要扫描的端口段为:");
    scanf("%d%d",&Port1,&Port2);

//初始化Windows Socket 2.2

    for( Port = Port1 ; Port <= Port2 ; Port ++ )

    {    WSAStartup(MAKEWORD(2,2), &wsaData);

        s = socket(AF_INET,SOCK_STREAM,0);

        ServerAddr.sin_family = AF_INET;
        ServerAddr.sin_port = htons(Port); 
        ServerAddr.sin_addr.s_addr = inet_addr(Cipna);

        if(connect(s,(SOCKADDR *) &ServerAddr,sizeof(ServerAddr)) == SOCKET_ERROR )
        {    closesocket(s);
            printf("%d CLOSE!\n",Port);
            continue;
        }
        else
            printf("%d OPEN!\n",Port);
        closesocket(s);
        
// 释放Windows Socket DLL的相关资源

        WSACleanup();
    }
}


根据connect扫描原理写了一个简单的程序,但不懂为什么在扫描中,如果端口关闭,程序就一直死在那里。
我查资料说是,如果connect连接不上,程序就会一直等待服务器的返回,进入什么休眠状态,直到超时。
如果要能进行端口的扫描,需要进行怎样的修改

------解决方案--------------------
改用非阻塞或异步方式
------解决方案--------------------
setsockopt
修改成非阻塞
使用select检测是否超时
------解决方案--------------------
select,connect连接超时
------解决方案--------------------
不是死了,而是等待超时,默认超时时间挺长的,大概是14秒。

可以设置为非阻塞,然后用select判断可读或者可写,如果一旦可读或者可写,说明连接成功了。