网络公共函数(大小端字节转换、网卡/ip信息获取等。)

来源:互联网 发布:巨灵数据库账号 编辑:程序博客网 时间:2024/05/16 08:04

网络公共函数(大小端字节转换、网卡/ip信息获取等。)

//NetCommmonFunction.h

//网络公共函数(大小端字节转换、网卡/ip信息获取等。)//float和double与CPU无关。一般来说,编译器是按照IEEE标准解释的,即把float/double看作4/8个字符的数组进行解释。因此,只要编译器是支持IEEE浮点标准的,就不需要考虑字节顺序。网络字节序为大端对齐模式。#pragma once#include <Windows.h>#include <list>#include <string>//ip地址信息typedef struct tagIpInfo{char szIp[128];char szMask[128];std::list<std::string> listGateway;}IpInfo;//网卡信息typedef struct tagNetAdapter{char AdapterName[256];//网卡名称char Description[256];//描述char szMacAddr[20];//std::list<IpInfo> listIp;//ip列表}NetAdapter;#define BigtoLittle16(A)   (( ((unsigned short)(A) & 0xff00) >> 8)    | \(( (unsigned short)(A) & 0x00ff) << 8))#define LittletoBig16(A)   (( ((unsigned short)(A) & 0x00ff) << 8)    | \(( (unsigned short)(A) & 0xff00) >> 8))#define BigtoLittle32(A)   ((( (unsigned int)(A) & 0xff000000) >> 24) | \(( (unsigned int)(A) & 0x00ff0000) >> 8)   | \(( (unsigned int)(A) & 0x0000ff00) << 8)   | \(( (unsigned int)(A) & 0x000000ff) << 24))#define LittletoBig32(A)   ((( (unsigned int)(A) & 0x000000ffUL) << 24) | \(( (unsigned int)(A) & 0x0000ff00UL) << 8)   | \(( (unsigned int)(A) & 0x00ff0000UL) >> 8)   | \(( (unsigned int)(A) & 0xff000000UL) >> 24))/*功能:当前电脑CPU是否大端模式参数:无返回:大端对齐标志*/BOOLLocalCpuIsBigEndian();/*功能:获取大端对齐标志参数:无返回:大端对齐标志*/BOOL&GetBigEndianFlag();/*功能:设置大端对齐标志参数:bBigEndian[in]:是否为大端对齐(TRUE:大端,FALSE:小端(默认))返回:无*/voidSetBigEndian(BOOL bBigEndian);/*功能:unsigned long大小端对齐转换参数:hostlong[in]:转换前数据返回:转换结果*/unsigned longh2n_conver_ulong(unsigned long hostlong);unsigned longn2h_conver_ulong(unsigned long netlong);/*功能:unsigned short大小端对齐转换参数:hostshort[in]:转换前数据返回:转换结果*/unsigned shorth2n_convert_ushort(unsigned short hostshort);unsigned shortn2h_convert_ushort(unsigned short netshort);/*功能:unsigned long long大小端对齐转换参数:hostlonglong[in]:转换前数据返回:转换结果*/unsigned long longh2n_convert_ulonglong(unsigned long long hostlonglong);unsigned long longn2h_convert_ulonglong(unsigned long long netlonglong);/*功能:获取网卡信息参数:listNetAdapter[out]:结果返回:BOOL*/BOOL GetLocalAdaptersInfo(std::list<NetAdapter> & listNetAdapter);

//NetCommmonFunction.cpp

#include "NetCommmonFunction.h"#include <winsock.h>#include <IPHlpApi.h>#include <iostream>#pragma comment(lib,"IPHlpApi.lib")#pragma comment(lib,"Ws2_32.lib")BOOL LocalCpuIsBigEndian(){union NUM{int a;char b;}num;num.a = 0x1234;if( num.b == 0x12 ){return TRUE;}return FALSE;}/*功能:获取大端对齐标志参数:无返回:大端对齐标志*/BOOL& GetBigEndianFlag(){static BOOL gbBigEndian = FALSE;return gbBigEndian;}/*功能:设置大端对齐标志参数:bBigEndian[in]:是否为大端对齐(TRUE:大端,FALSE:小端(默认))返回:无*/void SetBigEndian(BOOL bBigEndian){GetBigEndianFlag() = bBigEndian;}/*功能:大小端对齐转换参数:hostlong[in]:转换前数据返回:转换结果*/unsigned long h2n_conver_ulong(unsigned long hostlong){if(GetBigEndianFlag())return htonl(hostlong);else return hostlong;}unsigned longn2h_conver_ulong(unsigned long netlong){if(GetBigEndianFlag())return ntohl(netlong);else return netlong;}/*功能:大小端对齐转换参数:hostshort[in]:转换前数据返回:转换结果*/unsigned short h2n_convert_ushort(unsigned short hostshort){if(GetBigEndianFlag())return htons(hostshort);else return hostshort;}unsigned shortn2h_convert_ushort(unsigned short netshort){if(GetBigEndianFlag())return ntohs(netshort);else return netshort;}/*功能:unsigned long long大小端对齐转换参数:hostlonglong[in]:转换前数据返回:转换结果*/unsigned long longh2n_convert_ulonglong(unsigned long long hostlonglong){if(GetBigEndianFlag()){unsigned long temp_low = 0,temp_high = 0;temp_low = htonl((long)hostlonglong);temp_high = htonl((long)(hostlonglong >> 32));hostlonglong &= 0;hostlonglong |= temp_low;hostlonglong <<= 32;hostlonglong |= temp_high;return hostlonglong;}else{return hostlonglong;}}unsigned long longn2h_convert_ulonglong(unsigned long long netlonglong){if(GetBigEndianFlag()){unsigned long temp_low = 0,temp_high = 0;temp_low = ntohl((long)netlonglong);temp_high = ntohl((long)(netlonglong >> 32));netlonglong &= 0;netlonglong |= temp_low;netlonglong <<= 32;netlonglong |= temp_high;return netlonglong;}else{return netlonglong;}}/*功能:获取网卡信息参数:listNetAdapter[out]:结果返回:BOOL*/BOOL GetLocalAdaptersInfo(std::list<NetAdapter> & listNetAdapter){//IP_ADAPTER_INFO结构体PIP_ADAPTER_INFO pIpAdapterInfo = NULL;pIpAdapterInfo = new IP_ADAPTER_INFO;//结构体大小unsigned long ulSize = sizeof(IP_ADAPTER_INFO);//获取适配器信息int nRet = GetAdaptersInfo(pIpAdapterInfo,&ulSize);if (ERROR_BUFFER_OVERFLOW == nRet){//空间不足,删除之前分配的空间delete []pIpAdapterInfo;//重新分配大小pIpAdapterInfo = (PIP_ADAPTER_INFO) new BYTE[ulSize];//获取适配器信息nRet = GetAdaptersInfo(pIpAdapterInfo,&ulSize);//获取失败if (ERROR_SUCCESS  != nRet){if (pIpAdapterInfo != NULL){delete []pIpAdapterInfo;}return FALSE;}}NetAdapter naNetAdapter;//赋值指针PIP_ADAPTER_INFO pIterater = pIpAdapterInfo;while(pIterater){sprintf_s(naNetAdapter.AdapterName,255,"%s",pIterater->AdapterName);sprintf_s(naNetAdapter.Description,255,"%s",pIterater->Description);sprintf_s(naNetAdapter.szMacAddr,19,"%02X-%02X-%02X-%02X-%02X-%02X",pIterater->Address[0],pIterater->Address[1],pIterater->Address[2],pIterater->Address[3],pIterater->Address[4],pIterater->Address[5]);//IP地址列表naNetAdapter.listIp.clear();IpInfo ipIpInfo;//指向IP地址列表PIP_ADDR_STRING pIpAddr = &pIterater->IpAddressList;while (pIpAddr){sprintf_s(ipIpInfo.szIp,127,"%s",pIpAddr->IpAddress.String);sprintf_s(ipIpInfo.szMask,127,"%s",pIpAddr->IpMask.String);ipIpInfo.listGateway.clear();//指向网关列表PIP_ADDR_STRING pGateAwayList = &pIterater->GatewayList;while(pGateAwayList){//网关ipIpInfo.listGateway.push_back(pGateAwayList->IpAddress.String);pGateAwayList = pGateAwayList->Next;}pIpAddr = pIpAddr->Next;}//插入naNetAdapter.listIp.push_back(ipIpInfo);pIterater = pIterater->Next;//插入listNetAdapter.push_back(naNetAdapter);}//清理if (pIpAdapterInfo){delete []pIpAdapterInfo;}return TRUE;}

阅读全文
0 0
原创粉丝点击