网络公共函数(大小端字节转换、网卡/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
- 网络公共函数(大小端字节转换、网卡/ip信息获取等。)
- c#获取网卡的ip等信息
- MSDN例子 获取网卡、ip等信息
- C#获取IP等网络信息
- 网络信息获取函数和网卡信息获取
- 网络信息获取函数和网卡信息获取
- c#获取和设置网卡ip/dns等信息
- linux下获取IP等信息函数
- 如何获取网卡相关信息(包括mac, ip, mask, gateway等)?---利用GetAdaptersInfo
- VB6获取本机网络适配器信息(网卡名称、IP地址、子网掩码、默认网关等)
- 网络字节转换函数--IP地址转换--字符->int_32
- Qt获取IP地址、MAC地址等网卡信息,区分本地网卡、无线网卡和虚拟网卡
- 网络大小端转换函数
- 自己的网络字节序转换代码(大小端字节序)
- linux 获取本地网络信息 -ip,mac ,等
- 获取android手机信息,网络ip,序列号等
- Java 获取IP/MAC地址等网络信息的方法
- 获取网络IP信息
- Microsoft的现代数据管理
- TFS在项目中Devops落地进程(上)
- 私有云落地解决方案之网络篇-关键技术-GRE
- corejava第十版day02(去除元音 处理文档 计数 使用Map保留数据)
- 欢迎使用CSDN-markdown编辑器
- 网络公共函数(大小端字节转换、网卡/ip信息获取等。)
- 在PHP增删改查里面遇到的SUBMIT表单之后的文件跳转问题
- Android 常用正则验证 根据自己需要进行更改
- 测试人眼中的车联网(比亚迪云服务-3.2.1)——关于登录的处理逻辑
- oracle增删改查基础语句和代码例子
- Grid++Report6 B/S报表打印之Java,使用jsp打印报表实现
- 安卓taptargetview
- 我的php学习路线
- python scrapy 小白入门笔记(一)