获取本机IP地址代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

获取本机IP地址代码:
1、WSADATA结构被用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息。

这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。

它包含Winsock.dll执行的数据。

2、HOSTENT是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。

之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。

3、wVersionRequested=MAKEWORD(2,2);结果是514,说明是将前面的2和后面的2组成一个新的WORD。

即000000100000 0010。

而这个结果正是:512+2=514.
4、WSAStarup,是Windows SocKNDs Asynchronous的启动命令、Windows下的网络编程接口软件Winsock1或Winsock2里面的一个命令。

int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);wVersionRequested
⑴wVersionRequested:一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,高阶字节指定小版本(修订本)号,低位字节指定主版本号。

⑵lpWSAData指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。

WindowsSockets API提供的调用方可使用的最高版本号。

高位字节指出副版本(修正)号,低位字节指明主版本号。

返回值为0时表示成功。

详细说明
为了在应用程序当中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。

使用Socket的程序在使用Socket之前必须调用WSAStartup函数。

该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。

当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。

以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

5、gethostname()
简述:返回本地主机的标准主机名。

#include<Winsock2.h>
int PASCAL FAR gethostname(char FAR*name,int namelen);
name:一个指向将要存放主机名的缓冲区指针。

namelen:缓冲区的长度。

注释:该函数把本地主机名存放入由name参数指定的缓冲区中。

返回的主机名是一个以NULL结束的字符串。

主机名的形式取决于Windows Sockets实现-它可能是一个简单的主机名,或者是一个域名。

然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。

返回值:如果没有错误发生,gethostname()返回0。

6、gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。

注释:gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。

结构的声明与gethostbyaddr()中一致。

返回的指针指向一个由Windows Sockets实现分配的结构。

应用程序不应该试图修改这个结构或者释放它的任何部分。

此外,所有线程共用一份这个结构的拷贝,所以应用程序应该在发出其他Windows Scokets API调用前,把自己所需的信息拷贝下来。

gethostbyname()实现没有必要识别传送给它的IP地址串。

对于这样的请求,应该把IP地址串当作一个未知主机名同样处理。

如果应用程序有IP地址串需要处理,它应该使用inet_addr()函数把地址串转换为IP地址,然后调用gethostbyaddr()来得到hostent结构。

返回值:如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。

7、功能:将一个IP转换成一个互联网标准点分格式的字符串。

原型:char FAR*inet_ntoa(struct in_addr in);
头文件:arpa/inet.h Winsock2.h
参数:一个网络上的IP地址
返回值:如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。

8、MessageBox()
显示一个模式对话框,其中包含一个系统图标、一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。

消息框中返回一个整数值,该值指示用户单击了哪个按钮。

函数原型int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
参数
消息框的拥有窗口。

如果此参数为NULL,则消息框没有拥有窗口。

lpText:指向一个以NULL结尾的、含有将被显示的消息的字符串的指针。

lpCaption:指向一个以NULL结尾的、用于对话框标题的字符串的指针。

uType:指定一个决定对话框的内容和行为的位标志集。

此参数可以为下列标志组中标志的组合。

9、WSACleanup
功能终止Winsock2DLL(Ws2_32.dll)的使用.
头文件#include<Winsock2.h>
引用库#pragma comment(lib,"ws2_32.lib")
静态加入一个lib文件也就是库文件ws2_32.lib文件,提供相关API的支持,否则需要动态载入ws2_32.dll。

函数原型int PASCAL FAR WSACleanup(void);
返回值操作成功返回值为0;否则返回值为SOCKET_ERROR,可以通过调用WSAGetLastError获取错误代码。

在一个多线程的环境下,WSACleanup()中止了Windows Sockets在所有线程上的操作.
编译运行时如果出现无法找到WSACleanup()等函数,则一般解决方案为:
Project->setting->link->object/library往其中添加ws2_32.lib
代码为:
#include<stdio.h>
#include<winsock2.h>
int main(){
char host_name[256];
int WSA_return;
WSADATA WSAData;
HOSTENT*host_entry;
WORD wVersionRequested;
int i;
const char*pszAddr;
wVersionRequested=MAKEWORD(2,0);
WSA_return=WSAStartup(wVersionRequested,&WSAData);
if(WSA_return==0){
gethostname(host_name,sizeof(host_name));
host_entry=gethostbyname(host_name);
for(i=0;host_entry!=NULL&&host_entry->h_addr_list[i]!=NULL;i++){ pszAddr=inet_ntoa(*(struct in_addr*)host_entry->h_addr_list[i]);
MessageBox(NULL,pszAddr,host_name,MB_OK);
}
}
else
printf("ERROR!\n");
WSACleanup();
return0;
}。

相关文档
最新文档