VC++ 获取本机IP

//得到主机名称charhostName[256];gethostname(hostName,256);//获取主机名称//得到主机IP地址HOSTENT*hostEnt... //得到主机名称
char hostName[256];
gethostname(hostName,256);//获取主机名称
//得到主机IP地址
HOSTENT *hostEntry;
hostEntry=gethostbyname(hostName);
CString m_ipAddress=inet_ntoa(*(in_addr*)&hostEntry->h_addr_list[2]);
DWORD dwIP;
dwIP=inet_addr(m_ipAddress);
unsigned char *pIP=(unsigned char*)&dwIP;
m_networkServerIP.SetAddress(*pIP,*(pIP+1),*(pIP+2),*(pIP+3));

其中:inet_ntoa(*(in_addr*)&hostEntry->h_addr_list[2]);这句话看得我晕乎乎,有哪个大神解释下,*pIP,*(pIP+1),*(pIP+2),*(pIP+3)为什么能代表IP地址啊。。。
展开
 我来答
763401802
推荐于2017-10-12 · TA获得超过504个赞
知道小有建树答主
回答量:319
采纳率:0%
帮助的人:122万
展开全部
首先你要知道BYTE、WORD和DWORD分别是什么:
在VC6.0中BYTE、WORD和DWORD的定义分别是
typedef unsigned char BYTE; //一个字节,1 * 8位二进制数,范围 0 ~ 255
typedef unsigned short WORD; //两个字节,2 * 8位二进制数,范围0 ~ 65535
typedef unsigned long DWORD; //四个字节,4 * 8位二进制数,范围0 ~ 4294967295
可以看出,在存储的时候,1 DWORD = 2 WORD = 4 BYTE,
即 1 个DWORD 可以看成是 4 个连续的BYTE,也就是 unsigned char,
而 IP 地址刚好是 1 个DWORD,由 4 个 BYTE 组成,即常见的4段地址(比如192.168.0.1),这也就是为什么 IP 地址每段的数值都在0~255范围内(unsigned char)

现在回到代码:
unsigned char *pIP=(unsigned char*)&dwIP;
就是把 unsigned char* 指针 pIP 指向 dwIP 的第1个BYTE,所以, *(pIP+1)就指向dwIP的第2个BYTE,后面以此类推

对于inet_ntoa和inet_addr这两个函数,请自己百度一下就好了,相信你能看得懂

inet_ntoa():http://baike.baidu.com/view/4786779.htm
inet_addr():http://baike.baidu.com/view/569199.htm
Storm代理
2023-07-25 广告
StormProxies是一家提供动态代理服务器服务的企业,旨在帮助用户更好地管理网络访问和安全。以下是一些关于StormProxies的IP动态代理服务的特点:1. 高匿名性:StormProxies的动态代理服务器具有高匿名性,可以有效... 点击进入详情页
本回答由Storm代理提供
棠质弦S
推荐于2017-09-29 · 知道合伙人软件行家
棠质弦S
知道合伙人软件行家
采纳数:4350 获赞数:54731
从事电子产品开发近十年,现任北京北广网络事业部工程师。

向TA提问 私信TA
展开全部
  获取本机ip实现过程:
  WSAStartup()。Windows Sockets Asynchronous的启动命令,Windows下的网络编程必须先启用本命令,不然,后续的操作都会报错:10093:WSAStartup() 调用未成功执行过。
  gethostname()获得本机名
  gethostbyname()获得本机网络信息,存储到struct hostent *指针中,返回给调用者
  从struct hostent结构体信息中,获取ip地址,转换成字符串输出
  参考代码 :
  #include "winsock2.h"
  #pragma comment(lib,"ws2_32.lib")
  int main(int argc, char* argv[])
  {
  WSADATA wsaData;
  char name[155];
  char *ip;
  PHOSTENT hostinfo;
  if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )
  {
  if( gethostname ( name, sizeof(name)) == 0)
  {
  printf("hostname=%s\n", name );
  if((hostinfo = gethostbyname(name)) != NULL)
  {
  ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list); //得到地址字符串
  printf("local host ip: %s\n",ip);
  }
  }
  WSACleanup( );
  }
  return 0;
  }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式