MFC自动获取网络地址函数实现----广播地址,网关,子网掩码
2015-08-13 09:51
876 查看
void CSetSignalBoxDlg::OnBnClickedButtonGetbroadcastaddr()
{ //注释部分为另一种获取IP方式,可略过
//char Name[255];//定义用于存放获得的主机名的变量
//char *IP;//定义IP地址变量
//CString strIP="";
//PHOSTENT hostinfo;
//if(gethostname (Name, sizeof(Name)) == 0)
//{
// //如果成功地将本地主机名存放入由name参数指定的缓冲区中
// if((hostinfo = gethostbyname(Name)) != NULL)
// {
// //这是获取主机名,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo
// //为PHOSTENT型的变量,下面即将用到这个结构体
// IP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
// strIP.Format(IP);
// }
//}
CString strIP;
CString strMask;
CString strBroadcast;
CString strGateway;
in_addr broadcast;
PIP_ADAPTER_INFO pAdapterInfo; //IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名、网卡描述、网卡MAC地址、网卡IP等
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
pAdapterInfo = ( IP_ADAPTER_INFO *) malloc( sizeof( IP_ADAPTER_INFO ) );
ULONG ulOutBufLen;
//得到结构体大小,用于GetAdaptersInfo参数
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// 第一次调用GetAdapterInfo获取ulOutBufLen大小
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中ulOutBufLen参数既是一个输入量也是一个输出量
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter) //有多个网卡
{
strIP.Format(_T("%s"), pAdapter->IpAddressList.IpAddress.String);
strMask.Format(_T("%s"),pAdapter->IpAddressList.IpMask.String);
strGateway.Format(_T("%s"),pAdapter->GatewayList.IpAddress.String);
pAdapter = pAdapter->Next;
}
broadcast.S_un.S_addr =(inet_addr(strIP) & inet_addr(strMask))| (~inet_addr(strMask));
strBroadcast = inet_ntoa(broadcast);
}
SetDlgItemText(IDC_EDIT_ServerIP,strBroadcast);
SetDlgItemText(IDC_EDIT_SubnetMask,strMask);
SetDlgItemText(IDC_EDIT_Gateway,strGateway);
if (pAdapterInfo)
{
free(pAdapterInfo);
}
}
{ //注释部分为另一种获取IP方式,可略过
//char Name[255];//定义用于存放获得的主机名的变量
//char *IP;//定义IP地址变量
//CString strIP="";
//PHOSTENT hostinfo;
//if(gethostname (Name, sizeof(Name)) == 0)
//{
// //如果成功地将本地主机名存放入由name参数指定的缓冲区中
// if((hostinfo = gethostbyname(Name)) != NULL)
// {
// //这是获取主机名,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo
// //为PHOSTENT型的变量,下面即将用到这个结构体
// IP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
// strIP.Format(IP);
// }
//}
CString strIP;
CString strMask;
CString strBroadcast;
CString strGateway;
in_addr broadcast;
PIP_ADAPTER_INFO pAdapterInfo; //IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名、网卡描述、网卡MAC地址、网卡IP等
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
pAdapterInfo = ( IP_ADAPTER_INFO *) malloc( sizeof( IP_ADAPTER_INFO ) );
ULONG ulOutBufLen;
//得到结构体大小,用于GetAdaptersInfo参数
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// 第一次调用GetAdapterInfo获取ulOutBufLen大小
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中ulOutBufLen参数既是一个输入量也是一个输出量
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter) //有多个网卡
{
strIP.Format(_T("%s"), pAdapter->IpAddressList.IpAddress.String);
strMask.Format(_T("%s"),pAdapter->IpAddressList.IpMask.String);
strGateway.Format(_T("%s"),pAdapter->GatewayList.IpAddress.String);
pAdapter = pAdapter->Next;
}
broadcast.S_un.S_addr =(inet_addr(strIP) & inet_addr(strMask))| (~inet_addr(strMask));
strBroadcast = inet_ntoa(broadcast);
}
SetDlgItemText(IDC_EDIT_ServerIP,strBroadcast);
SetDlgItemText(IDC_EDIT_SubnetMask,strMask);
SetDlgItemText(IDC_EDIT_Gateway,strGateway);
if (pAdapterInfo)
{
free(pAdapterInfo);
}
}
相关文章推荐
- 网络基本功(一):细说网络传输
- TCP协议与UDP协议的区别
- 使用NSJSONSerialization解析从网络中获取的数据
- android网络下载图片并且显示在图库中
- Win10中WiFi Sense透露隐私怎么关闭无线网络密码共享?
- 在android下出现乱码的问题(在网络中传输和获取数据时)
- TCP/IP详解 卷I:协议 の链路层
- 实习第12天 多线程监控网络,解析XML(未完善完)
- Unity判断网络连接状况
- 几种计算机网络体系结构的对比分析
- HTTP协议(二)
- HTTP 错误 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurrentRequestLimit 设置的值。
- 用http 中doGet 方法获取mysql 数据库数据的错误总结
- mac 系统通用快捷键(mac 下的应用多数会往这些标准看齐)(转:http://yang3wei.github.io/blog/2013/02/08/chen-ni-yu-mac-chen-ni-yu-xcode/)
- 计算机网络note
- HTTP协议(一)
- Android 通过网络打开自己的APP(scheme)
- HttpClient 图解说明
- HTTP协议具体解释
- python网络编程(6)