您的位置:首页 > 理论基础 > 计算机网络

Windows Socket 网络编程(四) —— Winsock 编程接口

2010-05-25 22:56 155 查看
//////////////////////////////////////////////////////////
// initsock.h文件

/*****************************************************************************************
WSAStartup();加载相应版本的Winsock DLL;
第一个参数指定版本 MAKEWORD是将两个byte型合并成一个word型,一个在高8位(b),一个在低8位(a)
第二个参数 引用,所加库的版本信息填充他
函数调用成功返回0
*****************************************************************************************/

#include <winsock2.h>
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib

class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(::WSAStartup(sockVersion, &wsaData) != 0) //函数调用成功返回0
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};

//////////////////////////////////////////////////
// GetAllIps.cpp文件

#include "../common/InitSock.h"

/*****************************************************************************************
0x表示十六进制数
////////////////////////////////////////////////////////////////////////////////////////
unsigned long inet_addr(const char * cp); //将一个"aa.bb.cc.dd"类型的IP地址字符串转化为
32位的二进制数,用网络顺序存储的
char inet_ntoa(in_addr in); //将32位的二进制数转化为字符串
////////////////////////////////////////////////////////////////////////////////////////

struct hostent {
char FAR * h_name; //地址的正式名称
char FAR * FAR * h_aliases; //空字节-地址的预备名称的指针
short h_addrtype; //地址类型; 通常是AF_INET
short h_length; //地址的比特长度
char FAR * FAR * h_addr_list; //零字节-主机网络地址指针。网络字节顺序
#define h_addr h_addr_list[0]
};
char *h_name 表示的是主机的规范名。
char **h_aliases 表示的是主机的别名。
int h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
int h_length 表示的是主机ip地址的长度
int **h_addr_lisst 表示的是主机的ip地址
*****************************************************************************************/

#include <stdio.h>
CInitSock initSock; // 初始化Winsock库

void main()
{
char szHost[256];
// 取得本地主机名称
::gethostname(szHost, 256);
// 通过主机名得到地址信息
hostent *pHost = ::gethostbyname(szHost);
// 打印出所有IP地址
in_addr addr;
for(int i = 0; ; i++)
{
char *p = pHost->h_addr_list[i];
if(p == NULL)
break;

memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = ::inet_ntoa(addr);
printf(" 本机IP地址:%s /n ", szIp);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: