Windows网络编程笔记2
这一次看看重定向器和如何使用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的更多相关文章
- Windows网络编程笔记4 -- Winsock 协议相关知识
Win32平台上的Winsock编程,Winsock是一个与协议无关的接口.以下协议是我们需要了解的: 网络协议的特征包括: 1. 面向消息 2. 面向连接和无线接 3. 可靠性和次序性 4. ...
- Windows网络编程笔记1
第一部分 传统网络API 传统的网络接口NetBIOS.重定向器.邮槽.命名管道等.第一,NetBIOS(Network Basic Input/Output System, NetBIOS)“网络基 ...
- Windows网络编程笔记6 --- WinSock I/O 控制方法
Windows提供了两种方式“套接字模式”和“套接字I/O模型”,可对一个套接字上的I/O行为加以控制.套接字模式用于决定在随一个套接字调用时,那些 Winsock函数的行为.其中的模型包括括sele ...
- Windows网络编程笔记5 -- 其他套接字
包括红外线套接字(IrSock).IPX/SPX 套接字.NetBIOS 套接字.AppleTalk 套接字.ATM 套接字等.对这些套接字进行简单介绍. 第一.红外线套接字(I r S o c k) ...
- Windows网络编程笔记3 ---- 邮槽和命名管道
邮槽和命名管道的使用方法也很简单,只需几个有限的函数就可以实现双方的通信. 第三.邮槽 邮槽----进程间通信机制. 通过邮槽客户进程可以将消息通过广播给一个或多个服务进程.这是一个单向通信机制,缺点 ...
- Winsock网络编程笔记(1)----入门
今天第一次接触winsock网络编程,看的资料是Windows网络编程第二版.通过博客记住自己的看书笔记.. 在这里贴出第一个程序,虽然程序什么都没做,但以此作为入门,熟悉其网络编程风格.. #inc ...
- Linux网络编程笔记(修订版)
我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1. 基本概念 2. 基本接口 2.1. 打开一个socket 2.2. 将 ...
- storysnail的Windows串口编程笔记
storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...
- [转]Windows网络编程学习-面向连接的编程方式
直接附上原文链接:windows 网络编程学习-面向连接的编程方式
随机推荐
- 转 zigbee学习笔记---Channel、PANID、发射功率及其它参数
现对z-stack里几个网络参数的设置以及如何获取总结一下.信道配置:Zigbee在3个频段定义了27个物理信道:868MHz频段中定义了1个20Kb/s信道,915MHz频段中定义了10个40Kb/ ...
- js中arr.sort的用法
sort(sortfunction)为JS的数组对象(Array)的一个方法,提供排序功能 参数 sortFunction 为可选项,是用来确定排序原则的js函数, 这个函数有两个参数,分别代表每次排 ...
- 最好的 6 个 HTML5 的多媒体播放器
是 HTML5 中新引入的标签,用来在 Web 网页中嵌入视频播放功能,无需 Flash 和其他嵌入式插件的支持,是浏览器内建的功能,不过 旨在一些高级浏览器中支持,例如 Firefox, Sa ...
- 奇怪的Unrooted Tests错误
错误如图: 条件如下: Eclipse里的Maven工程. 使用JUnit4(这个是否必须不知,反正我的工程用的4) 修改某个Test类里的方法名,或者增加一个Test方法. 现象: 在MyEclip ...
- 破解 D-H 协议
756: 破解 D-H 协议 时间限制: 1 Sec 内存限制: 128 MB提交: 78 解决: 18[提交] [状态] [讨论版] [命题人:admin] 题目描述 Diffie-Hellma ...
- Python判断一个数是否为小数
一.判断一个数是否为小数 1.有且仅有一个小数点 2.小数点的左边可能为正数或负数 3.小数点的右边为正数 二.实现代码 def is_float(str): if str.count('.') == ...
- js调用后台,后台调用前台等方法总结
1. javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中; 2.在前台写一个js函数,内容为docume ...
- 进入docker容器并执行命令的的3中方法
进入docker容器并执行命令的的3中方法 docker exec nsenter docker attach "container" 建议使用nsenter, exec有 ...
- 十、Shell 函数
Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...
- python * args和** kwargs的用法
所属网站分类: python基础 > 函数 作者:慧雅 链接: http://www.pythonheidong.com/blog/article/18/ 来源:python黑洞网 www.py ...