找回密码
 立即注册
搜索
查看: 276|回复: 3

获取局域网在线用户名和ip的c++类

[复制链接]

3

主题

2

回帖

7

积分

新手上路

积分
7
发表于 2003-2-25 14:28:32 | 显示全部楼层 |阅读模式
#pragma once

#include <winnetwk.h>
#include <afxtempl.h>

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

typedef struct _WorkStation
{
        TCHAR szName[128];
        TCHAR szIP[128];
}WorkStation, *LPWORKSTATION;

typedef CList<WorkStation, WorkStation&> CWorkStationList;

class CGTNetwork
{
public:
        CGTNetwork(void);
        ~CGTNetwork(void);
       
        const bool IsServer(const LPNETRESOURCE lpNetRS);
        const bool IsDomain(const LPNETRESOURCE lpNetRS);
        const bool IsGeneric(const LPNETRESOURCE lpNetRS);


        const bool EnumerateNetRS(const LPNETRESOURCE lpNetRS, DWORD dwFlags = RESOURCE_GLOBALNET);
       

        bool GetWorkStationInfo(const LPNETRESOURCE lpNetRS, LPWORKSTATION ws);
        const CString GetRemoteIP(const LPNETRESOURCE lpNetRS);
        const CString GetRemoteName(const LPNETRESOURCE lpNetRS);

public:
        CWorkStationList m_WorkStationList;

};

#include "StdAfx.h"
#include "gtnetwork.h"

CGTNetwork::CGTNetwork(void)
{
        WSAData wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);
}

CGTNetwork::~CGTNetwork(void)
{
        m_WorkStationList.RemoveAll();
        WSACleanup();
}

const CString CGTNetwork::GetRemoteName(const LPNETRESOURCE lpNetRS)
{
        CString str;

        if ((lpNetRS != NULL) && IsServer(lpNetRS) && (lpNetRS->lpRemoteName != NULL))
        {
                str = lpNetRS->lpRemoteName;

                if (0 == str.Left(2).Compare("\\\\"))
                        str.Delete(0, 2);
        }

        return str;
}

const CString CGTNetwork::GetRemoteIP(const LPNETRESOURCE lpNetRS)
{
        CString strName, strIP;
        LPHOSTENT host = NULL;
        in_addr * ptr = NULL;

        strName = lpNetRS->lpRemoteName;

        if (0 == strName.Left(2).Compare("\\\\"))
                strName.Delete(0, 2);

        host = gethostbyname(strName);

        if (host == NULL)
        {
                TRACE0("\n\r gethostbyname func fail");
                return strIP;
        }

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

        if (ptr == NULL)
                return strIP;

        int a = ptr->S_un.S_un_b.s_b1;
        int b = ptr->S_un.S_un_b.s_b2;
        int c = ptr->S_un.S_un_b.s_b3;
        int d = ptr->S_un.S_un_b.s_b4;

        strIP.Format("%d.%d.%d.%d", a, b, c, d);

        return strIP;
}

const bool CGTNetwork::IsServer(const LPNETRESOURCE lpNetRS)
{
        return lpNetRS->dwDisplayType == RESOURCEDISPLAYTYPE_SERVER;
}

const bool CGTNetwork::IsDomain(const LPNETRESOURCE lpNetRS)
{
        return lpNetRS->dwDisplayType == RESOURCEDISPLAYTYPE_DOMAIN;
}

const bool CGTNetwork::IsGeneric(const LPNETRESOURCE lpNetRS)
{
        return lpNetRS->dwDisplayType == RESOURCEDISPLAYTYPE_GENERIC;
}

const bool CGTNetwork::EnumerateNetRS(const LPNETRESOURCE lpNetRS, DWORD dwFlags)
{
        DWORD         dwScope;
        LPNETRESOURCE lpnrLocal = NULL;
        DWORD         dwResult;
        HANDLE        hEnum = 0;
       
        dwScope = dwFlags;
       
        dwResult = WNetOpenEnum(dwScope, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, lpNetRS, &hEnum);

        if (dwResult != NO_ERROR)
        {
                TRACE0("Open Enum Fail");
                return false;
        }

        DWORD dwBuf = 16384;
        DWORD dwEnties = 0xFFFFFFFF;

        lpnrLocal = (LPNETRESOURCE)GlobalAlloc(GPTR, dwBuf);

        if (lpnrLocal == NULL)
        {
                TRACE0("GlobalAlloc fail");
                return false;
        }
       
        do
        {
                dwResult = WNetEnumResource(hEnum, &dwEnties, lpnrLocal, &dwBuf);

                if (dwResult != NO_ERROR)
                {
                        TRACE0("WNetEnumResource Fail");
                        continue;
                }

                for (DWORD i=0; i<dwEnties; i++)
                {
                        if (RESOURCEUSAGE_CONTAINER == (lpnrLocal.dwUsage & RESOURCEUSAGE_CONTAINER) &&
                                lpnrLocal.dwDisplayType != RESOURCEDISPLAYTYPE_SERVER)
                        {
                                if (!EnumerateNetRS(&lpnrLocal))
                                {
                                        TRACE1("Enum lprsLocal[%d] &Ecirc;§°&Uuml;",i);
                                }
                        }

                        WorkStation ws;
                       
                        if (GetWorkStationInfo(&lpnrLocal, &ws))
                                m_WorkStationList.AddTail(ws);
                               
                }

        }while(dwResult != ERROR_NO_MORE_ITEMS);

        if (lpnrLocal)
                GlobalFree((HGLOBAL)lpnrLocal);

        WNetCloseEnum(hEnum);

        return true;
}



bool CGTNetwork::GetWorkStationInfo(const LPNETRESOURCE lpNetRS, LPWORKSTATION ws)
{
        CString strName, strIP;

        strName = GetRemoteName(lpNetRS);
        strIP   = GetRemoteIP(lpNetRS);
       
        if ((!strName.IsEmpty()) && (!strIP.IsEmpty()))
        {
                strcpy(ws->szName, strName);
                strcpy(ws->szIP, strIP);
                return true;
        }

        return false;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

48

主题

527

回帖

780

积分

荣誉版主

积分
780
发表于 2003-2-26 12:13:40 | 显示全部楼层
good
回复

使用道具 举报

3

主题

38

回帖

59

积分

注册会员

积分
59
发表于 2003-2-27 05:46:08 | 显示全部楼层
好东西,谢谢
回复

使用道具 举报

46

主题

282

回帖

429

积分

中级会员

积分
429
发表于 2003-3-29 03:03:32 | 显示全部楼层

真行

不会是你自己写的把
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|海浩社区

GMT+8, 2025-9-21 04:53 , Processed in 0.087099 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表