关于Enum局域网中的机器

原创 2004年06月29日 10:56:00

好不容易考完了,打算把很久以前就想写的一个小东西写出来,其实就是一个局域网内的聊天工具,原因很单纯:我的哥们有时想相互问个问题,又不想用Messenger(其实是不想被从游戏中弹出来),所以这个任务就落到了我的头上,同时练练手,好久没有编程了,因为考试。

其中用到了一个Enum局域网中的机器的程序,本来用WNetOpenEnum和WNetEnumResource就可以实现的,于是我写了这么一个东西:

bool CLANViewer::EnumHosts(NETRESOURCE* pNetRes)

    HANDLE hEnum = NULL;
    DWORD dwRet= WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, pNetRes, &hEnum);
    if (dwRet != NO_ERROR) return false;

    NETRESOURCE* pResBuf = new NETRESOURCE[8];
    DWORD cCount, dwBuf = 8*sizeof NETRESOURCE;
    cCount = (DWORD)-1;
    do {
        dwRet = WNetEnumResource(hEnum, &cCount, (LPVOID)pResBuf, &dwBuf);
        for (DWORD i = 0; i < cCount; ++i) {
            AddHostToVector(&pResBuf[i]);
        }
        if(pResBuf[i].dwUsage & RESOURCEUSAGE_CONTAINER)
            EnumHosts(&pResBuf[i]);

        if (dwRet == ERROR_NO_MORE_ITEMS) { //Enum finished.
            dwRet = NO_ERROR;
            break;
        }else if (dwRet != NO_ERROR)
            break;
       }while (dwRet == NO_ERROR);

    delete pResBuf;
    return (dwRet == NO_ERROR);
}

这个东东在Win2K下跑得很好,但是在WinXP下跑不出来,我后来跟踪了一下,发现在Win2K下程序进行Enum是直接就得到了所有的计算机明,但是在WinXP下则会先得到一个东东是“Resource Container”,也就是说dwUsage为RESOURCEUSAGE_CONTAINER,注意看我用黄色底子标出的部分:在进行第一次递归后,While循环回去,再次调用WNetEnumResource,但是这时cCount已经有了一个正值(上次调用返回的),因此调用失败,当然跑不出来。

改正很简单:把那句话移到循环内就可以了。程序如下:

bool CLANViewer::EnumHosts(NETRESOURCE* pNetRes)

    HANDLE hEnum = NULL;
    DWORD dwRet= WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, pNetRes, &hEnum);
    if (dwRet != NO_ERROR) return false;

    NETRESOURCE* pResBuf = new NETRESOURCE[8];
    DWORD cCount, dwBuf = 8*sizeof NETRESOURCE;
    do {
        cCount = (DWORD)-1;
        dwRet = WNetEnumResource(hEnum, &cCount, (LPVOID)pResBuf, &dwBuf);
        for (DWORD i = 0; i < cCount; ++i) {
            AddHostToVector(&pResBuf[i]);
        }
        if(pResBuf[i].dwUsage & RESOURCEUSAGE_CONTAINER)
            EnumHosts(&pResBuf[i]);

        if (dwRet == ERROR_NO_MORE_ITEMS) { //Enum finished.
            dwRet = NO_ERROR;
            break;
        }else if (dwRet != NO_ERROR)
            break;
       }while (dwRet == NO_ERROR);

    delete pResBuf;
    return (dwRet == NO_ERROR);
}

在XP和2K下都跑出来的。

java基础总结 --- enum枚举的常量相关方法、自动售货机(状态模式)例子

package com.zghw.base.enumx; import java.text.DateFormat; import java.util.Date; /** * 允许程序员为enum实...
  • zghwaicsdn
  • zghwaicsdn
  • 2016年02月11日 18:23
  • 1740

发现局域网所有主机

遇到问题: 1。接入一个不知道网段网段的局域网; 2。需要发现局域网的所有的ip; 处理步骤 1。用原始套接字,监听arp消息,获取接口的mac地址; 2。根据收到的arp广播,可以从arp协议的...
  • bestboyxie
  • bestboyxie
  • 2016年09月05日 23:37
  • 1207

java上传文件到局域网内的另一台计算机上

分析   今天又遇到一个问题:怎样将文件上传到局域网内的另一台机器上。解决方案粗略的想了下大概有如下几种: 1. 搭建一台FTP服务器,然后通过FTP协议进行文件传输。这个方式固然有效,但是有点...
  • qq791967024
  • qq791967024
  • 2015年09月22日 19:19
  • 2831

Java学习篇之--检测主机是否在线Ping

Ping技术哪家强?         最近想写个程序,检测一下远程主机是否在线,于是在网上找到了很多前辈的方法,现在总结一下,分享给大家,希望能够抛砖引玉:         方法一:利用java.ne...
  • A_little_e
  • A_little_e
  • 2015年03月24日 15:51
  • 1308

局域网通过LINUX主机上网手记

前两天接到一项任务,要把一个局域网的机器通过一台机器上INTERNET,这样的事情做过不少,无非是选一台好点的机器装上SYGATE什么的就行了,但是这次不同,人家非要求用LINUX,说什么稳定。——本...
  • luke_wang
  • luke_wang
  • 2015年01月20日 21:36
  • 1034

本机上访问tomcat项目可以,局域网内的其他机器访问不到项目

这几天开发项目时,遇到一个问题:同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,ip可以ping通,但是加上端口号和项目名就不行了。发现这个问题是由于本机上的防火墙造成的,但是又不好将...
  • hsj1213522415
  • hsj1213522415
  • 2017年05月02日 15:08
  • 4459

邮件发送--局域网中配置James邮件服务器(二)

James邮件服务器的搭建与使用。
  • calangan
  • calangan
  • 2017年04月16日 22:45
  • 18478

局域网跨机访问WCF服务出错本机访问正常的问题

最近在使用WCF服务进行通信,初学遇到的第一个问题就是不能进行跨机通信,当然本机上可以,只要按照步骤进行配置。我已经按照书上网络上各路大神 所说的,进行了各种花样配置,尝试了各种花样寄宿方法,可以依然...
  • qq_32250495
  • qq_32250495
  • 2016年04月08日 20:46
  • 1139

#define与enum,你不知道的那些事

什么时候需要用到enum呢,就是变量的数值在几个范围之间.red,blue,black.这样用enum比较好.当然也可以用define.但是define维护起来比较麻烦. #define 适合比较少...
  • hbuxiaofei
  • hbuxiaofei
  • 2014年03月25日 11:33
  • 8287

Windows局域网通过NTP设置时间同步

NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。如果局域网计算机(Windows系统)可以连接Internet,可以通过“控制面板”—>...
  • bflong
  • bflong
  • 2015年08月11日 15:33
  • 6057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Enum局域网中的机器
举报原因:
原因补充:

(最多只允许输入30个字)