?? globals.cpp
字號:
#include "stdafx.h"
#include "globals.h"
#include "define.h"
#include <winsock2.h>
#include <crtdbg.h>
SOCKET s=0;;
// Function name : GetAdapterMAC
// Description : 得到網(wǎng)卡的物理地址,這里只能處理有一塊網(wǎng)卡的情況
// Return type : bool
// Argument : UCHAR addr[6]
bool GetAdapterMAC(UCHAR addr[6])
{
ResetAdapter();//reset 網(wǎng)卡
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 : 得到本機(jī)網(wǎng)卡的個數(shù)
// Return type : UCHAR
UCHAR GetAdapterNum()
{
NCB ncb;
LANA_ENUM lenum;
UCHAR uCode;
memset(&ncb,0,sizeof(NCB));
//得到網(wǎng)卡的個數(shù)
ncb.ncb_command=NCBENUM;
ncb.ncb_buffer=(UCHAR *)&lenum;
ncb.ncb_length = sizeof(lenum);
uCode=Netbios(&ncb);
if(uCode!=NRC_GOODRET)//沒有得到網(wǎng)開的個數(shù)
return 0;
return lenum.length;//返回網(wǎng)卡個數(shù)
}
// Function name : ResetAdapter
// Description : Reset 一張LAN網(wǎng)卡
// 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 : 設(shè)置網(wǎng)卡可以接收所有IP的數(shù)據(jù)(混雜模式)
// 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;
}
//創(chuàng)建原始套接字
s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
//設(shè)置為對IP頭親自操
BOOL bFlag=TRUE;
err=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bFlag,sizeof(bFlag));
if(err!=0)
return false;
//獲得本機(jī)地址
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;
//把原始套接字綁定到本定網(wǎng)卡
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為輸入輸出參數(shù),為1時執(zhí)行,0時取消
DWORD dwValue = 1;
// 設(shè)置 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 : 接收數(shù)據(jù)
// 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地址得到機(jī)器名
// Return type : int 機(jī)器名字符串長度
// Argument : char * addr ip地址
// Argument : char * name 機(jī)器名
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -