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();
}
最新文章
- ASP.NET Web API WebHost宿主环境中管道、路由
- wkhtmltopdf乱码解决方案
- c#socket编程基础
- 第十四天 jni 的使用
- IOS block使用中碰到的一个小坑
- JAVA常用数据结构及原理分析
- ZIP压缩文件夹中上个月的文件,并将备份文件拷贝到服务器
- Linux文件夹执行权限
- 思维方式--SMART原则
- GlusterFS常用命令小结
- 机器学习 —— 类不平衡问题与SMOTE过采样算法
- 【Android】屏幕尺寸的表示
- input输入框只能输入正整数、字母、小数、汉字
- selenium chromedriver geckodriver iedriverserver下载
- 2019/02/09 对于KinectFusion 的理解
- Sudoku(POJ2676/3074)
- 开源项目商业模式分析(2) - 持续维护的重要性 - Selenium和WatiN
- NModbus类库使用
- TabLayout+ViewPager的简单使用
- 轻博客类Web原型制作分享——Tumblr