局域网的IP扫描

#include <vcl.h>
#include <winsock2.h>
//---------------------------------------------------------------------------
bool    GetLanIPAddress(TStrings *strings)
{
    int             originCount = strings->Count;
    struct hostent  *host;
    struct in_addr  *ptr;
    DWORD           dwScope = RESOURCE_CONTEXT;
    HANDLE          hEnum;
    NETRESOURCE     *netResource = NULL;
    WSADATA         wsaData;
    int             a, b, c, d;

    WNetOpenEnum(dwScope, NULL, NULL, NULL, &hEnum);
    WSAStartup(MAKEWORD(1,1), &wsaData);
    if ( hEnum ) {
        DWORD Count = 0xFFFFFFFF;
        DWORD BufferSize = 2048;
        LPVOID Buffer = new char[2048];
        WNetEnumResource( hEnum, &Count, Buffer, &BufferSize );
        netResource = (NETRESOURCE*)Buffer;
        char szHostName[200];
        unsigned int i;
        for( i=0; i<BufferSize/sizeof(NETRESOURCE); i++, netResource++ )
        if( netResource->dwUsage    == RESOURCEUSAGE_CONTAINER  &&
            netResource->dwType     == RESOURCETYPE_ANY         ) {

            if( netResource->lpRemoteName ) {
                String strFullName  = netResource->lpRemoteName;
                if( strFullName.Pos("") == 1 )
                    strFullName = strFullName.SubString(3,strFullName.Length()-2);

                gethostname( szHostName, strlen(szHostName) );
                host = gethostbyname(strFullName.c_str());

                if( host == NULL)
                    continue;

                ptr = (struct in_addr *)host->h_addr_list[0];

                a   = ptr->S_un.S_un_b.s_b1;    //172
                b   = ptr->S_un.S_un_b.s_b2;    //22
                c   = ptr->S_un.S_un_b.s_b3;    //106
                d   = ptr->S_un.S_un_b.s_b4;    //213

                strings->Add(Format("%d.%d.%d.%d",ARRAYOFCONST((a,b,c,d))));
            }
        }

        delete Buffer;
        WNetCloseEnum( hEnum );
    }

    WSACleanup();
    return(strings->Count > originCount);
}
//---------------------------------------------------------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值