这一次看看重定向器和如何使用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. Alembic基本使用

    1.alembic init YOUR_ALEMBIC_DIR 该目录下会有alembic.ini以及YOUR_ALEMBIC_DIR的目录. alembic.ini 提供了一些基本的配置 YOUR_ ...

  2. PHP报错configure error Cannot find libmysqlclient under usr

    编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法 (问题产生,mysql是yum安装的,libmysqlclient* ...

  3. vue的MVVM模式和生命周期总结(一)

    一.MVVM模式 MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel ...

  4. HDU 2602 Bone Collector骨头收藏者(01背包)

    题意:收藏骨头. 思路: 常规的01背包. #include <iostream> #define N 1005 using namespace std; int volume[N]; / ...

  5. 慎用python的pop和remove方法

    申明:转载请注明出处!!! Python关于删除list中的某个元素,一般有两种方法,pop()和remove(). 如果删除单个元素,使用基本没有什么问题,具体如下. 1.pop()方法,传递的是待 ...

  6. 进程peb结构、获得peb的方法

    PEB :进程环境块TEB.ProcessEnvironmentBlock成员就是PEB的结构体地址TEB结构体位于FS段选择符所指的段内存的起始地址处,且ProcessEnvironmentBloc ...

  7. Aizu 2300 Calender Colors(暴力)

    状压以后,直接暴力枚举,2^20约等于1e6,而且满足bitcount = m的状态很少. #include<bits/stdc++.h> using namespace std; +; ...

  8. 在PHP中读取二进制文件

    很多时候,数据并不是用文本的方式保存的,这就需要将二进制数据读取出来,还原成我们需要的格式.PHP在二进制处理方面也提供了强大的支持. 任务 下面以读取并分析一个PNG图像的文件头为例,讲解如何使用P ...

  9. 2018.6.19 Java核心API与高级编程实践复习总结

    Java 核心编程API与高级编程实践 第一章 异常 1.1 异常概述 在程序运行中,经常会出现一些意外情况,这些意外会导致程序出错或者崩溃而影响程序的正常执行,在java语言中,将这些程序意外称为异 ...

  10. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...