📄 globals.cpp
字号:
#include "stdafx.h"
#include "globals.h"
#include "define.h"
#include <winsock2.h>
#include <crtdbg.h>
SOCKET s=0;;
// Function name : GetAdapterMAC
// Description : 得到网卡的物理地址,这里只能处理有一块网卡的情况
// Return type : bool
// Argument : UCHAR addr[6]
bool GetAdapterMAC(UCHAR addr[6])
{
ResetAdapter();//reset 网卡
NCB ncb;
UCHAR uCode;
ASTAT Adapter;
memset(addr,0,6*sizeof(UCHAR));
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
strcpy((char *)ncb.ncb_callname, "* " );
ncb.ncb_buffer = (UCHAR *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uCode = Netbios( &ncb );
memcpy(addr,Adapter.adapt.adapter_address,6*sizeof(UCHAR));
if(uCode==NRC_GOODRET)
return true;
else
return false;
}
// Function name : GetAdapterNum
// Description : 得到本机网卡的个数
// Return type : UCHAR
UCHAR GetAdapterNum()
{
NCB ncb;
LANA_ENUM lenum;
UCHAR uCode;
memset(&ncb,0,sizeof(NCB));
//得到网卡的个数
ncb.ncb_command=NCBENUM;
ncb.ncb_buffer=(UCHAR *)&lenum;
ncb.ncb_length = sizeof(lenum);
uCode=Netbios(&ncb);
if(uCode!=NRC_GOODRET)//没有得到网开的个数
return 0;
return lenum.length;//返回网卡个数
}
// Function name : ResetAdapter
// Description : Reset 一张LAN网卡
// Return type : void
void ResetAdapter()
{
NCB ncb;
UCHAR uCode;
memset(&ncb,0,sizeof(NCB));
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
//
uCode = Netbios( &ncb );
}
// Function name : SetAdapterReceiveAll
// Description : 设置网卡可以接收所有IP的数据(混杂模式)
// Return type : void
bool SetAdapterReceiveAll()
{
//检查Winsock版本
WORD ver=MAKEWORD(2,2);
WSADATA wsaData;
int err=WSAStartup(ver,&wsaData);
if(err!=0)
{
_RPT2( _CRT_ERROR,"启动WinSocket version %d.%d 错误!",2,2);
return false;
}
//创建原始套接字
s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
//设置为对IP头亲自操
BOOL bFlag=TRUE;
err=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bFlag,sizeof(bFlag));
if(err!=0)
return false;
//获得本机地址
char hostname[256];
memset(hostname,0,256);
err=gethostname(hostname,256);
if(err!=0)
return false;
struct hostent * phost=gethostbyname(hostname);
if(!phost)
return false;
//把原始套接字绑定到本定网卡
struct sockaddr_in addr_in;
memset(&addr_in,0,sizeof(addr_in));
addr_in.sin_addr=*(in_addr *)phost->h_addr_list[0];
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);//端口号,可以是任意值,但最好不要和公共端口冲突
bind(s, (PSOCKADDR)&addr_in, sizeof(addr_in));
// dwValue为输入输出参数,为1时执行,0时取消
DWORD dwValue = 1;
// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(s, SIO_RCVALL, &dwValue);
return true;
}
// Function name : ReceiveAdapter
// Description : 接收数据
// Return type : int
// Argument : byte * buf
// Argument : int len
int ReceiveAdapter(byte * buf,int len)
{
return recv(s,(char *)buf, len, 0);
}
// Function name : GetHostName
// Description : 通过IP地址得到机器名
// Return type : int 机器名字符串长度
// Argument : char * addr ip地址
// Argument : char * name 机器名
int GetHostName(char * addr,char * name)
{
unsigned int node=inet_addr(addr);
if(node==INADDR_NONE)
return -1;
WORD ver=MAKEWORD(2,2);
WSADATA wsaData;
if(WSAStartup(ver,&wsaData)!=0)
return -1;
struct hostent * phost=gethostbyaddr((char *)&node,4,AF_INET);
if(!phost)
return -1;
int len=strlen(phost->h_name);
memcpy(name,phost->h_name,len);
return strlen(name);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -