• Windows网络编程笔记1



    第一部分 传统网络API

      传统的网络接口NetBIOS、重定向器、邮槽、命名管道等
    第一,NetBIOS(Network Basic Input/Output System, NetBIOS)“网络基本输入/输出系统”,其中T C P / I P和I P X / S P X的协议上实施N e t B I O S编程接口。

      1、LANA 编号
      LANA 编号是NetBIOS协议进行通信的保障,每个网卡都会至少有一个LANA编号,两台机器进行通信时必须保证LANA编号一致才能进行。
      2、NetBIOS 名字
      NetBIOS 名字 是一个长度16字符的字符串,在Win32环境中,针对每个可用的 LANA编号,每个进程都会为其维持一张NetBIOS名字表。
      共有两种类型:唯一名字和组名。唯一名字是通过WINS进行确认的,组名则是在一个网络环境中一组IP和NetBIOS的集合,可对组进行多播。其中WINS解释如下:
      WINS是Windows Internet Naming Server,即Windows Internet命名服务。它提供一个分布式数据库,能在路由网络的环境中动态地对IP地址和NETBios名的映射进行注册与查询。 WINS用来登记NetBIOS计算机名,并在需要时将它解析成为IP地址。WINS数据库是动态更新的。
      计算机名和工作组名对应NetBIOS的唯一名字和组名

      在Cmd下输入nbstat -n 也可以看到本机的NetBIOS本机名称表
      
      
      其中的名称解释为
      
      其中的组名标识符,我电脑上没什么组名,只有一个默认的组名WORKGROUP
      
      3、NetBIOS 特性
      NetBIOS 同时提供了“面向连接”服务以及“无连接”服务。
      关于面向连接和无连接,我觉得用手机比喻特别好,面向连接就像打电话,首先拨号,然后建立一条虚拟的链路,就好象专线一样,在这个过程中,按照对方手机号(目的地址)首先寻找附近的基站,然后基站之间与基站之间建立连接(如同路由与路由及交换机之间的连接),最后再和两个手机互连(虚拟链路建立成功),这样,手机就拨通了(前提是对方必须在线),可以通话了。
      而无连接就像发短信,首先你给个手机号(目的地址),然后发送短信(数据),注意这里不管对方手机时候关机、停机等,然后发送(发送完就不用管了),短信首先也是去基站,按照手机号(地址)选择转发路径,在基站之间转发,如果对方开机就立马送过去,否则就暂存起来,等一段时间(这个具体多少我也不清楚,但是肯定有个有效期的),在有效期内对方开机就会受到短信,过期作废。
      4、NetBIOS API 只有一个

        UCHAR Netbios(PNCB pNCB);//(现在才发现Win7不支持NetBIOS)

      MSDN上说:[Netbios is not supported on Windows Vista, Windows Server 2008, and subsequent versions of the operating system]。
      若想连接NetBIOS 应用,唯一需要的库是Netapi32.lib
      注意:进行任何Netbios调用之前,不要一开始就填写结构内的各个成员,而应先将这个 NCB结构清零!

    typedef struct _NCB {
      UCHAR  ncb_command;//这个是命令的类型,包括发送,连接,断开,添加。删除等。。。
      UCHAR  ncb_retcode;//
      UCHAR  ncb_lsn;//
      UCHAR  ncb_num;//
      PUCHAR ncb_buffer;//
      WORD   ncb_length;//
      UCHAR  ncb_callname[NCBNAMSZ];//
      UCHAR  ncb_name[NCBNAMSZ];//
      UCHAR  ncb_rto;
      UCHAR  ncb_sto;
      void   (CALLBACK *ncb_post)( struct *NCB);
      UCHAR  ncb_lana_num;
      UCHAR  ncb_cmd_cplt;
      UCHAR  ncb_reserve[X];
      HANDLE ncb_event;
    } NCB, *PNCB;

      成员介绍如下:

      

      使用Netbios()函数可以实现类似socket的同步和异步通信。

    使用举例:

    int LanaEnum(LANA_ENUM *lenum)
    {
        NCB ncb;//
    
        ZeroMemory(&ncb,sizeof(NCB));//清空ncb
        ncb.ncb_command = NCBENUM;//指定要选择的操作
        ncb.ncb_buffer = (PUCHAR)lenum;//数据缓存
        ncb.ncb_length = sizeof(LANA_ENUM);//数据长度
        if (Netbios(&ncb) != NRC_GOODRET)//调用Netbios()函数,当返回值为NRC_GOODRET时表示函数执行成功
        {
            printf("ERROR:NetBIOS : NCBENUM :%d 
    ",ncb.ncb_retcode);
            return ncb.ncb_retcode;//
        }
        return NRC_GOODRET;//
    }

      这个NetBIOS实现通信的过程和socket实现通信的过程有着惊人的一致,但是这个东西毕竟出现的很早了,并不适合现在的需求。估计很少会用到。

  • 相关阅读:
    ASP.NET常用代码.doc
    logo集合
    链接提示文字的实现
    详解css定位与定位应用
    在b/s开发中经常用到的javaScript技术整理
    上传图象,略缩
    ASP.NET中17种正则表达式
    生成静态页方式一
    转“C#实现web信息自动抓取”
    用来面试的代码
  • 原文地址:https://www.cnblogs.com/songliquan/p/3382728.html
Copyright © 2020-2023  润新知