//
// 调试平台: Visual C++.NET 2003
// 注意:
// 1. 新建 "win32项目"
// 2. 在工程中添加 "WSock32.dll"
//
#include "windows.h"
#include "winsock.h"
int WSAReturn;
WSADATA WSAData;
HOSTENT *hostEntry;
char hostName[256];
char hostAddress[256];
int APIENTRY WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
WSAReturn = WSAStartup( 0x0101 , &WSAData );
if( WSAReturn == 0 )
{
//得到主机名
gethostname( hostName , 256 );
//根据主机名得到主机实例
hostEntry = gethostbyname( hostName );
//提取IP地址
if( hostEntry != 0 )
{
wsprintf(
hostAddress , "%d.%d.%d.%d" ,
(hostEntry->h_addr_list[0][0]&0x00ff) ,
(hostEntry->h_addr_list[0][1]&0x00ff) ,
(hostEntry->h_addr_list[0][2]&0x00ff) ,
(hostEntry->h_addr_list[0][3]&0x00ff)
);
}
char msg[512];
wsprintf( msg , "主机名: %s/nIP地址: %s/n" , hostName , hostAddress );
MessageBox( NULL , msg , "主机名及IP" , MB_OK );
}
WSACleanup();
}
//
// 主要用的函数有
// WSAStartup()
// WSACleanup()
// gethostname()
// gethostbyname()
//
WSAStartup()
【函数原型】
int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
【使用说明】
每一个使用winsock的应用程序,都必须进行WSAStart函数调用,
并且只有在调用成功之后才能使用其它的winsock网络操作函数。
wVersionRequired:<输入>表示欲使用的Winsock版本,这是一个WORD类型的整数,
它的高位字节定义的是次版本号,低位字节定义的是主版本号。
LpWSAData:<输出>是一个指向WSADATA资料的指针。这个资料我们一般不使用。
返回值:调用成功返回0;
否则,返回出错信息。
WSAClenaup()
【函数原型】
int PASCAL FAR WSACleanup(void);
【使用说明】
winsock使用后,要调用WSACleanup函数关闭网络设备,以便释放其占用的资源。
gethostname()
【函数原型】
int PASCAL FAR gethostname (char FAR * name, int namelen);
【使用说明】
该函数可以获取本地主机的主机名,其中:
name:<输出>用于指向所获取的主机名的缓冲区的指针。
Namelen:<输入>缓冲区的大小,以字节为单位。
返回值:若无错误,返回0;
否则,返回错误代吗。
gethostbyname()
【函数原型】
struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);
【使用说明】
该函数可以从主机名数据库中得到对应的“主机”。
该函数唯一的参数name就是前面调用函数gethostname()得到的主机名。
若无错误,刚返回一个指向hostent结构的批针,它可以标识一个“主机”列表。
Hostent结构定义如下:
Struct hostent
{
char FAR * h_name;
char FAR FAR ** h_aliases;
short h_addrtype;
char FAR FAR ** h_addr_list;
}
其中:
h_name:<输入>主机名地址(PC)。
h_aliases:一个由主机备用名组成的空中止数组。
H_addrtype:返回地址的类型,对于Winsock,这个域总是PF_INET。
H_lenth:每个地址的长度(字节数),对应于PF_INET域应该为4。
H_addr_list:应该以空指针结尾的主机地址的列表,返回的地址是以网络顺序排列的。
其中,h_addr_list[0]存放的就是本地主机的4个字节的IP地址,即:
h_addr_list[0][0].h_addr_list[0][1].h_addr_list[0][2].h_addr_list[0][3]