标题:基于三次握手的端口扫描,就是不对,求大神指导
只看楼主
木头心
Rank: 2
等 级:论坛游民
帖 子:19
专家分:35
注 册:2013-4-17
结帖率:100%
已结贴  问题点数:30 回复次数:3 
基于三次握手的端口扫描,就是不对,求大神指导
程序代码:
#include<iostream>
#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();

}

我通过TCP对它的端口进行连接,然后返回一个值来确定他的端口是否开放,可是它返回所有的值都是负数,求指导
搜索更多相关主题的帖子: comment 
2015-03-20 14:31
木头心
Rank: 2
等 级:论坛游民
帖 子:19
专家分:35
注 册:2013-4-17
得分:0 
2015-03-20 14:37
木头心
Rank: 2
等 级:论坛游民
帖 子:19
专家分:35
注 册:2013-4-17
得分:0 
2015-03-20 14:37
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:21 
有返回值应该就可以判断是开放的(不懂c)
2015-03-21 16:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442855-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.382339 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved