这一次看看重定向器和如何使用Netbios函数获取本机mac地址

5、获取Mac地址

利用NCBASTAT命令实现,适配器状态命令会返回一个 ADAPTER_STATUS结构,紧接着是大量 NAME_BUFFER结构。

 typedef struct _ADAPTER_STATUS {
UCHAR adapter_address[];//这个就是mac地址
UCHAR rev_major;
UCHAR reserved0;
UCHAR adapter_type;
UCHAR rev_minor;
WORD duration;
WORD frmr_recv;
WORD frmr_xmit; WORD iframe_recv_err; WORD xmit_aborts;
DWORD xmit_success;
DWORD recv_success; WORD iframe_xmit_err; WORD recv_buff_unavail;
WORD t1_timeouts;
WORD ti_timeouts;
DWORD reserved1;
WORD free_ncbs;
WORD max_cfg_ncbs;
WORD max_ncbs;
WORD xmit_buf_unavail;
WORD max_dgram_size;//数据包最大长度
WORD pending_sess;
WORD max_cfg_sess;
WORD max_sess;//最大会话数
WORD max_sess_pkt_size;
WORD name_count;
} ADAPTER_STATUS, *PADAPTER_STATUS;
typedef struct _NAME_BUFFER {
UCHAR name[NCBNAMSZ];
UCHAR name_num;
UCHAR name_flags;
} NAME_BUFFER, *PNAME_BUFFER;

  特别值得注意的字段当属 M A C地址(adapter_address)、数据报最大长度(max_dgram_size)以及最大会话数(max_sess)。

  要想调用NCBSTAT,需要设置的字段包括 ncb_command,ncb_buffer,ncb_length,ncb_ lana_num以及ncb_callname。

  注意 记住所有Microsoft机器名字都将其第16个字节设为0,应该用空格来替代它。

下面来看看如何获取本地mac

 //获取本机mac地址,通过Netbios()函数,需要添加附加依赖库netapi32.lib

 #include "stdio.h"
#include "stdlib.h"
#include "httpext.h"
#include "windef.h"
#include "Nb30.h"
int getMAC(char * mac);//获取mac
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [];
}ASTAT,*PASTAT; ASTAT Adapter;//适配器 int getMAC(char * mac)
{
NCB ncb;
LANA_ENUM lana_enum;//LANA 编号
UCHAR uRetCode;//返回值
memset(&ncb, , sizeof(ncb));
memset(&lana_enum, , sizeof(lana_enum));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *)&lana_enum;
ncb.ncb_length = sizeof(LANA_ENUM);
uRetCode = Netbios(&ncb);//调用函数 if(uRetCode != NRC_GOODRET)
return uRetCode;
//函数执行成功
for(int lana=; lana<lana_enum.length; lana++)
{
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[lana];
uRetCode = Netbios(&ncb);
if(uRetCode == NRC_GOODRET)
break;
} if(uRetCode != NRC_GOODRET)
return uRetCode;
memset(&ncb, , sizeof(ncb));
ncb.ncb_command = NCBASTAT;//获取状态信息
ncb.ncb_lana_num = lana_enum.lana[];
strcpy((char*)ncb.ncb_callname, "*");
ncb.ncb_buffer = (unsigned char *)&Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb); if(uRetCode != NRC_GOODRET)
return uRetCode; sprintf(mac,"%02X-%02X-%02X-%02X-%02X-%02X",
Adapter.adapt.adapter_address[],
Adapter.adapt.adapter_address[],
Adapter.adapt.adapter_address[],
Adapter.adapt.adapter_address[],
Adapter.adapt.adapter_address[],
Adapter.adapt.adapter_address[]); return ;
}

可以在main函数里直接调用这个函数就行

 #include "GetMac.h"
int main()
{
char mac[];
getMAC(mac);
printf("MAC Address : %s \n",mac);
getchar();
return ;
}

第二、重定向器

“重定向器”由网络提供者展示给用于接收和处理远程 I / O服务请求的操作系统。

1、“U N C路径” 

  UNC为网络文件及设备的访问建立了一套统一的规范。它最大的特点便是不必指定或引用一个已映射到远程文件系统的本地驱动器字母。这一点使得应用程序可变得“与驱动器字母无关”。

  U N C名字完全解决了这些问题,它的格式如下:

  \\[服务器]\[共享名] \[路径]

  第一部分是\ \ [服务器],必须以两个反斜杠开头,紧跟着一个服务器名字。

  第二部分是\ [共享名],它对应着远程服务器上的一个“共享入口”或者“共享位置”。

  第三部分\ [路径] 对应的是共享位置下的某个具体目录(或子目录)。

  比如说,假定现在有一台名为Myserver的服务器,在其本地硬盘驱动器 D : \上设置了一个共享目录,名为D : \ M y f i l es ,并将这一长串名字简化为“M y s h a r e”这个易记的“共享名”。现在,假定该共享目录下含有一个名为sample.txt件。

那么,假如网络中其他任何一台机器想引用(访问)这个 M P 3音乐文件,只需像下面这样指定它的U N C名字即可:

  \\Myserver\Myshare\sample.txt

  使用UNC必须有一个网络提供者进行协调转换,网络提供者实际只是一种服务,通过网络硬件来访问位于远程计算机上的共享资源,比如文件和打印机等等。

其实操作起来挺简单的

代码如下:

 #include "windows.h"
#include "stdio.h" void main()
{
HANDLE FileHandle;
DWORD BytesWritten;
//打开文件
if ((FileHandle = CreateFile("\\\\Myserver\\Myshare\\Sample.txt",GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)) == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with error%d\n",GetLastError()); return ;
}
//写入数据
if (WriteFile(FileHandle,"This is a test!",,&BytesWritten,NULL) == )
{ printf("WriteFile failed with error%d\n",GetLastError());
return ;
} if (CloseHandle(FileHandle) == )
{
printf("CloseHandle failed with error%d\n",GetLastError());
return ;
}
getchar();
}

Windows网络编程笔记2的更多相关文章

  1. Windows网络编程笔记4 -- Winsock 协议相关知识

     Win32平台上的Winsock编程,Winsock是一个与协议无关的接口.以下协议是我们需要了解的: 网络协议的特征包括: 1.  面向消息 2.  面向连接和无线接 3.  可靠性和次序性 4. ...

  2. Windows网络编程笔记1

    第一部分 传统网络API 传统的网络接口NetBIOS.重定向器.邮槽.命名管道等.第一,NetBIOS(Network Basic Input/Output System, NetBIOS)“网络基 ...

  3. Windows网络编程笔记6 --- WinSock I/O 控制方法

    Windows提供了两种方式“套接字模式”和“套接字I/O模型”,可对一个套接字上的I/O行为加以控制.套接字模式用于决定在随一个套接字调用时,那些 Winsock函数的行为.其中的模型包括括sele ...

  4. Windows网络编程笔记5 -- 其他套接字

    包括红外线套接字(IrSock).IPX/SPX 套接字.NetBIOS 套接字.AppleTalk 套接字.ATM 套接字等.对这些套接字进行简单介绍. 第一.红外线套接字(I r S o c k) ...

  5. Windows网络编程笔记3 ---- 邮槽和命名管道

    邮槽和命名管道的使用方法也很简单,只需几个有限的函数就可以实现双方的通信. 第三.邮槽 邮槽----进程间通信机制. 通过邮槽客户进程可以将消息通过广播给一个或多个服务进程.这是一个单向通信机制,缺点 ...

  6. Winsock网络编程笔记(1)----入门

    今天第一次接触winsock网络编程,看的资料是Windows网络编程第二版.通过博客记住自己的看书笔记.. 在这里贴出第一个程序,虽然程序什么都没做,但以此作为入门,熟悉其网络编程风格.. #inc ...

  7. Linux网络编程笔记(修订版)

    我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1.   基本概念 2.   基本接口 2.1.   打开一个socket 2.2.   将 ...

  8. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  9. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

随机推荐

  1. iOS 解决tableView中headerView头部视图不跟随tableView滑动的方法

    解决方法如下: if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y <= pushNewsT ...

  2. sk-learning(1)

    sk-learning学习笔记(1) 简介 scikit learning 是一个python的机器学习库,内置许多机器学习的算法诸如svm.随机森林.逻辑回归.贝叶斯网络等算法.覆盖了分类.聚类.回 ...

  3. 详细讲解:使用tp3.2.3完成简单的注册登录功能

    使用3.2.3进行了一个简单不过的注册登录功能,界面介绍: 1.注册: 2.登录: 3.登录成功后: 没错,就是简单的让你特别容易上手,上面运用到的知识有: (1)自动验证.自动完成 (2)sessi ...

  4. linux 命令——3 pwd (转)

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  5. 访问mongo数据库报错

    It looks like you are trying to access MongoDB over HTTP on the native driver port. 出错原因: 1.没有安装mong ...

  6. Java后台工程师的3次面试

    第一次面试 我面的是一个中小公司,在BOSS直聘上面找的,去之前看了看关于Java的一些基础知识,在牛客网上面看的,也做了一下牛客网的题目.然后跟HR约了一个时间就去面试了.因为第一次面试,一点经验都 ...

  7. IPv4与IPv6的校验函数

    1. PHP校验IPv4掩码是否合法,在网上搜了下,排名最高的如下, <?php function is_mask($mask){ $bin_mask =(string)decbin(ip2lo ...

  8. 梁勇Java语言程序设计第三章全部例题 为第五次作业

    完成例题3-1,通过系统当前时间毫秒值获取随机10以内的整数判断加的结果是否正确,不用if语句 package com.swift; import java.util.Scanner; public ...

  9. git与github账号建立SSH连接

    第1步:创建SSH Key.在用户主目录下,(就是在你的工作空间一层)看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步 ...

  10. Pots POJ - 3414 (搜索+记录路径)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22688   Accepted: 9626   Special J ...