问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用C++编程获得某台机器的IP地址

发布网友 发布时间:2022-04-24 00:09

我来回答

3个回答

热心网友 时间:2023-08-01 15:06

  对于这个古老的问题,VC知识库的精华区以及以往的在线杂志中都有详尽不一的描述。本文提供的方法是一个比较完整的解决方案,并附有具体的实现细节。希望大家对这个问题有彻底的熟悉。其实,假如你熟悉 Windows 的Sockets API,并了解一些底层的Winsock知识。那么要获得某台机器的IP地址并不是什么难事。一台机器可以装多块网卡,因此它就可能有多个IP地址。目前很多发烧友的PC机都装有多块网卡。其中一块网卡与调制解调器(MODEM)或者ADSL适配器相连,另一块与家里的局域网(LAN)相连。对于有宽带连接条件的家庭,这更是一种典型的配置。任何事情,一旦你知道了解决的方法,一切都会变得如此简单。下面是本文提供的一个简单的控制台程序(程序名为getip1),其功能就是显示本机的IP地址。如图一所示: 图一 getip1的运行画面

    下面是 getip1 程序的代码,很简单: ////////////////////////////////////////////////////////////////
// getip1.cpp
//
// 本程序报告本机上每一块网卡的IP地址
// 命令行编译命令为:
//
// cl getip1.cpp wsock32.lib
//
// 请一定要在环境变量中正确指定LIB库的路径;可以运行vcvars32.bat
//
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <stdio.h>

int main()
{
////////////////
// 初始化 Windows sockets API. 要求版本为 version 1.1
//
Word wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData)) {
printf("WSAStartup failed %s\n", WSAGetLastError());
return -1;
}

//////////////////
// 获得主机名.
//
char hostname[256];
int res = gethostname(hostname, sizeof(hostname));
if (res != 0) {
printf("Error: %u\n", WSAGetLastError());
return -1;
}
printf("hostname=%s\n", hostname);
////////////////
// 根据主机名获取主机信息. 
//
hostent* pHostent = gethostbyname(hostname);
if (pHostent==NULL) {
printf("Error: %u\n", WSAGetLastError());
return -1;
}
//////////////////
// 解析返回的hostent信息.
//
hostent& he = *pHostent;
printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",

he.h_name, he.h_aliases, he.h_addrtype, he.h_length);

sockaddr_in sa;
for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
// 输出机器的IP地址.
printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串
}
//////////////////
// 终止 Windows sockets API
//
WSACleanup();
return 0;
}  更多内容请看C/C++技术专题IP地址知识普及专题Java编程开发手册专题,或   要使用Winsock,首先必须调用WSAStartup,最后结束时不要忘了调用WSACleanup。要获取IP地址,首先必须得到机器的主机名(host name),调用gethostname就可以实现,有了主机名,接下来调用gethostbyname来获取包括IP地址在内的更多的主机信息。        gethostbyname返回一个指向hostent数据结构的指针,这个结构在<winsock.h>文件中是这样定义的: // 来自winsock.h
strUCt hostent {
char FAR * h_name; /* 正式的主机名*/
char FAR * FAR * h_aliases; /* 别名列表*/
short h_addrtype; /* 主机地址类型*/
short h_length; /* 地址长度*/
char FAR * FAR * h_addr_list; /* 地址清单*/
};  这是个典型的底层APIs使用的数据结构,很多人都不是很熟悉它。实际上,hostent是一个变长的数据结构,h_name是主机名,在例子程序中的值为 "zxn.hangwire.sdb"。没有别名(h_aliases)。h_addrtype是地址类型(或者也叫地址家族),在例子程序中的值为2(AF_INET = internet,其它内容参见winsock.h)。h_length是每一个地址的长度,以字节为单位。因为IP地址的长度是4个字节,所以在例子程序中的值为4,h_addr_list是地址数组的开始点,它们一个接着一个存放,结尾是一个null。每一个x.y.z.w数字占一个字节。为了将IP地址格式化为x.y.z.w的形式,必须将地址数组先拷贝到一个叫sockaddr的数据结构中,然后调用一个非凡的函数inet_ntoa。  

热心网友 时间:2023-08-01 15:06

gethostbyname()函数;

热心网友 时间:2023-08-01 15:07

gethostbyname()
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小白开始做牛腩烧番茄前,应该做哪些准备? 普洱茶不管是纯料还是拼配它本身就很有意思 普洱茶的纯料VS拼配,谁更值得珍藏? 为什么我们听到熟悉的歌曲的音乐会感觉在唱歌词呢? abs制动防抱死系统什么时候用到 请问有谁知道离朝阳北路的煊特嘉园(炫特区)最近的浩沙健身俱乐部在哪 ... 朝阳北苑郊野公园有哪些 北苑哪些公园 北京北苑健身有哪些 王者荣耀黄忠开大怎么转圈 请问, 用c语言怎样获取ip地址啊 谢谢了 如何用C语言编程得到本地主机得IP和主机名? 请问c语言怎样获取计算机ip地址啊 怎么获取本机的IP! 编程:C语言编程取得本机ip地址 请问在公共图书馆给小朋友免费放映B站,爱奇艺等平台上下载的电影算侵权吗 我也想在哔哩哔哩上传一个综艺节目【说出我世界】因为B站没有我是在其他地方下载的会不会有版权问题侵权? b站视频有html分享功能(没有标注不能转载),将分享代码用在自己的网站上算侵权吗? 把b站上的视频录下来发到空间并标明是某某发的算侵权吗(作者写了未经允许,不可私自转载。)? 转载b站的视频链接违法吗? 转载央视的电视节目到b站会侵权吗? 请问把B站视频分享到qq空间或者朋友圈。这种算不算侵权? 分享一些课程在b站上会不会侵权? 当前华为最好的手机是哪款,多少钱?谢谢! 胡华为p20和牛蛙5pro哪个更值得买 蟑螂屋里的药用剪开吗 天气冷了,屋里感觉又有蟑螂了,萌推有蟑螂屋吗? 问一下华为荣耀20Pro和nova5Pro买哪款好一点,好纠结 放置蟑螂屋后蟑螂乱跑 华为荣耀20pro 和华为p20pro和华为nova5pro哪个更好一些不考虑jia g 100%桑蚕丝四件套怎么洗? 真丝床上用品四件套怎么洗护 蚕丝四件套怎么洗? 可以用洗发露洗蚕丝被罩吗? 御锦纺蚕丝被脏了怎么办? 洗蚕丝被的正确方法 如何计算网站需要多大虚拟主机空间 衣领有多少种分类? 旗袍领口样式 旗袍的材质一般有哪几种? 怎样区分圆襟,直襟,双襟,斜襟,双襟旗袍。就是每种旗袍的最显著的特点,有图片更好~~ 请问衣领的种类有多少种?立领是怎样的? 夏天做个旗袍裙流行啥领子? 旗袍有什么样的款式? 蒸米饭先把洗好的米泡半小时然后再放多少水合适呢 这种玻璃上贴的胶纸怎么擦干净呢? 微信群收不到信息怎么回事?而且看不到群 微信没看到被移出群聊,怎么就看不到群消息,怎么回事? 群里发的信息看不到怎么回事 为什么群聊天我看不到?