在MFC中用一个函数获得IP地址后怎么把IP地址显示在IP控件上

在MFC中用一个函数获得IP地址后怎么把IP地址显示在IP控件上,第1张

IP控件也是常用的控件之一,也是最简单的一个控件,MFC对他的封装无非就是一个字符串的处理。使用起来也相当简便。

首先拖动控件到指定的地方,用ClassWizard为其关联一个变量,我们看到变量的类型任然是一个类,IPAddressCtrl的类,下面介绍几种常用的 *** 作:

1, 将IP地址输出到Ip控件显示:只需要短短两行代码,假定要显示的IP地址是19216811,则在确定的消息相应函数添加

Cpp代码

CString a="19216811";

m_ipSetWindowText(a);

2 将IP地址输入到程序中:

Cpp代码

BYTE a1,a2,a3,a4;

m_ipGetAddress(a1,a2,a3,a4);

CString str;

strFormat("%d%d%d%d",a1,a2,a3,a4);//这里的nf得到的值是IP值了

MessageBox(str);

要获取IP地址,首先必须得到机器的主机名(host

name),调用gethostname就可以实现,有了主机名,接下来调用gethostbyname来获取包括IP地址在内的更多的主机信息。gethostbyname返回一个指向hostent数据结构的指针,这个结构在<winsockh>文件中是这样定义的:

//

来自winsockh

struct

hostent

{

char

FAR

h_name;

/

正式的主机名/

char

FAR

FAR

h_aliases;

/

别名列表/

short

h_addrtype;

/

主机地址类型/

short

h_length;

/

地址长度/

};

这是个典型的底层APIs使用的数据结构,很多人都不是很熟悉它。实际上,hostent是一个变长的数据结构,h_name是主机名,在例子程序中的值为

"zxnhangwiresdb"。没有别名(h_aliases)。h_addrtype是地址类型(或者也叫地址家族),在例子程序中的值为2(AF_INET

=

internet,其它内容参见winsockh)。h_length是每一个地址的长度,以字节为单位。因为IP地址的长度是4个字节,所以在例子程序中的值为4,h_addr_list是地址数组的开始点,它们一个接着一个存放,结尾是一个null。每一个xyzw数字占一个字节。为了将IP地址格式化为xyzw的形式,必须将地址数组先拷贝到一个叫sockaddr的数据结构中,然后调用一个特殊的函数inet_ntoa。

图二是hostent

结构在内存中存放示意图:

图二hostent

结构在内存中的存放示意图

相信以上的解释再辅以阅读代码,你以后不再会对hostent结构感到陌生。

最后,顺祝编程愉快!

代码仅供参考:

定义两个字符串变量,并且声明获取计算机名称和IP的函数GetLocalHostIPName(CString &sLocalName, CString &sIpAddress)。

CString m_strLocalIP; //本机计算机IP  

    CString m_strLocalName; //本机计算机名  

    int GetLocalHostIPName(CString &sLocalName, CString &sIpAddress); //获取本机名称IP

定义函数GetHostName(CString &sLocalName, CString &sAddress)。

char name[128];

gethostname(name, 128);//获得主机名

#include<WinSock2h>

#pragma comment(lib,"WS2_32")

class CInitSock

{

public:

    CInitSock(BYTE minorVer=2,BYTE majorVer=2)

    {

        WSADATA wsaData;

        WORD sockVersion=MAKEWORD(minorVer,majorVer);

        if(WSAStartup(sockVersion,&wsaData)!=0)

        {

            exit(0);

        }

    }

    ~CInitSock()

    {

        WSACleanup();

    }

};

WSADATA 这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据。它包含Winsockdll 执行的数据。

WSAStartup    为了在应用程序当 中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用 Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明 副版本、低位字节指明主版本; *** 作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时, *** 作系统根据请求的Socket版本来搜索相应的 Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

WSACleanup   应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调 用当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源任何打开的并已建立连接的SOCK_STREAM类型套接口在调用 WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送 对应于一个任务进行的每一次WSAStartup()调用,必须有一个 WSACleanup()调用只有最后的WSACleanup()做实际的清除工作;前面的调用仅仅将Windows Sockets DLL中的内置引用计数递减一个简单的应用程序为确保WSACleanup()调用了足够的次数,可以在一个循环中不断调用WSACleanup()直 至返回WSANOTINITIALISED

#include"initsockh"

#include<iostream>

using std::cout;

using std::endl;

CInitSock initSock;

void IP()

{

    int i;

    char szHost[256];

    gethostname(szHost,256);

    hostent pHost=gethostbyname(szHost);

    in_addr addr;

   

    char p=pHost->h_addr_list[0];

    memcpy(&addrS_unS_addr,p,pHost->h_length);

    char szIp=inet_ntoa(addr);

    cout<<szIp<<endl;

}

int main()

{

    IP();

    system("pause");

    return 0;

}

gethostname()   返回本地主机的标准主机名。

int PASCAL FAR gethostname(char FAR name, int namelen); 

name: 一个指向将要存放主机名的缓冲区指针。 

namelen:缓冲区的长度。

hostent      是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。

#define h_addr h_addr_list[0]    h_addr_list中的第一地址。

struct hostent { 

     char h_name;       //地址的正式名称 

     char h_aliases; //空字节-地址的预备名称的指针。

     int h_addrtype; //地址类型; 通常是AF_INET。

     int h_length;     //地址的比特长度。

     char h_addr_list;     //零字节-主机网络地址指针。网络字节顺序。

};

memcpy

extern void memcpy(void destin, void source, unsigned n);

由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

function ip() {

if(getenv('>

#include <stdioh>

#include <stdlibh>

#include <unistdh>

#include <stringh>

#include <sys/socketh>

#include <netinet/inh>

#include <net/ifh>

#include <netdbh>

#include <arpa/ineth>

#include <sys/ioctlh>

//获取地址

//返回IP地址字符串

int getlocalip(char outip)

{

int i=0;

int sockfd;

struct ifconf ifconf;

char buf = (char)malloc(512);

struct ifreq ifreq;

char ip;

//初始化ifconf

ifconfifc_len = 512;

ifconfifc_buf = buf;

if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)

{

return -1;

}

ioctl(sockfd, SIOCGIFCONF, &ifconf); //获取所有接口信息

close(sockfd);

//接下来一个一个的获取IP地址

ifreq = (struct ifreq)buf;

i = ifconfifc_len/sizeof(struct ifreq);

char pos = outip;

int count;

for(count = 0; (count < 5 && i > 0); i--)

{

ip = inet_ntoa(((struct sockaddr_in)&(ifreq->ifr_addr))->sin_addr);

if(strncmp(ip,"127001", 3)==0) //排除127xxx,继续下一个

{

ifreq++;

continue;

}else

{

printf("%s\n", ip);

strcpy(pos,ip);

int len = strlen(ip);

pos = '\t';

pos += len+1;

count ++;

ifreq++;

}

}

free(buf);

return 0;

}

//——————————-函数的调用方式————————————-

int main(int argc, char argv)

{

char ip = {''};

if ( getlocalip( ip ) == 0 )

{

printf("本机IP地址是: %s\n", ip );

}

else

{

printf("无法获取本机IP地址 ");

}

return 0;

}

方法如下:

CString CNetUsers::GetLocalIP()

{

//该函数返回本机的 IP 地址

//通过: 2000。7。13

CString Result = "";

WSADATA wsaData;

char Name[255];

hostent hostinfo;

WORD wVersionRequested = MAKEWORD( 2, 2 );

if(WSAStartup(wVersionRequested,&wsaData) == 0){

if(gethostname(Name,sizeof(Name))==0){

hostinfo = gethostbyname(Name);

if(hostinfo != NULL)

Result = inet_ntoa ((struct in_addr )hostinfo->h_addr_list);

}

WSACleanup();

}

return Result;

}

以上就是关于在MFC中用一个函数获得IP地址后怎么把IP地址显示在IP控件上全部的内容,包括:在MFC中用一个函数获得IP地址后怎么把IP地址显示在IP控件上、如何用C++编程获得某台机器的IP地址、MFC如何获取自己电脑的IP地址和主机名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9354115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存