基于三次握手的端口扫描

196 阅读1分钟

#include

#include<WinSock2.h>

#include<errno.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()

{

//地址和ip
unsigned short SearchPort ;
 char SearchIp[20];
 //关于写的指针
 fd_set fdwrite;
 int ret;

 //时间结构体
 timeval time;
 

SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
cout << sockClient << endl;

SOCKADDR_IN addr_ser;
cout << "ip:   ";
cin >> SearchIp;
cout << endl;
addr_ser.sin_addr.S_un.S_addr = inet_addr(SearchIp);
addr_ser.sin_family = AF_INET;
for (SearchPort = 1; SearchPort < 1024; SearchPort++)
{

    addr_ser.sin_port = htons(SearchPort);

    connect(sockClient, (SOCKADDR*) &addr_ser, sizeof(addr_ser));
    
    
     time = { 3, 0 };
        // select之前要清空write set
        FD_ZERO(&fdwrite);

        // 把s加入到write set里
        FD_SET(sockClient, &fdwrite);

        if ((    ret= select(0, NULL, &fdwrite, NULL, &time    )    )== SOCKET_ERROR)
        { 
        //    cout << ret<<endl;
        //    cout << WSAGetLastError()<<endl;
            // 到这里表示出现了错误
        //    cout << "jdfjsldjf";
        }

        if (ret > 0)
        {

            // 到这里如果你只accept了一个socket,那么ret==1,如果你和多个socket进行io,ret的值将大于1
            // 现在你要做的就是检查s是否在write set里
            if (FD_ISSET(sockClient, &fdwrite)) // 如果是这样
            {
                cout << SearchPort << "   on" << endl;
                // socket sockClient现在处于可写状态,之后你可以调用fdwrite来获取s上的信息
            }
        }
       if (ret == 0)
        {

                // 到这里如果你只accept了一个socket,那么ret==1.
                // 现在你要做的就是检查s是否在read set里
                if (FD_ISSET(sockClient, &fdwrite)) // 如果是这样
                {
                    cout << SearchPort << "超时" << endl;
                    // socket sockClient现在处于可写状态,之后你可以调用fdwrite来获取s上的信息
                }

        }
    //***********************************************************************************************8
    /*if (ret < 0)
    {
        cout << SearchPort;
    }
    if (ret == 0)
    {
        cout << SearchPort << " on" << endl;
        closesocket(sockClient);
    }*/
     //***************************************************************************************************
       closesocket(sockClient);
}


getchar();
getchar();

}