(1)和主机名相关的函数
①gethostbyname——将主机名转成IP
参数 | 含义 |
const char FAR *name | 需要解析的主机名字符串 |
返回值——指向WinSock内部缓冲区一个HOSTENT结构体的指针。(因为一个主机名可能对应多个IP地址) | |
【图解HOSTENT结构体】
②gethostbyaddr函数——将IP地址转换成主机名
参数 | 含义 |
const char FAR *addr | 指向IP地址的指针(注意,不是字符串,而是网络字节顺序的32位IP) |
int len | IP地址的数据长度,当然是4个字节了 |
int type | 地址的类型,一般为AF_INET |
返回值 | 失败时返回0。 成功时返回HOSTENT结构体,其中的h_name指向转换后的主机名 |
③gethostname——获取本地计算机的主机名
参数 | 含义 |
const char FAR *addr | 在指定的缓冲区返回本地计算机的主机名字符串 |
int namelen | 指定缓冲区的大小 |
(2)获取套接字两端的地址信息
①getpeername——获取对端的IP地址和端口
参数 | 含义 |
SOCKET s | 套接字句柄 |
struct sockaddr FAR *name | 指向SOCKADDR_IN结构体的指针,函数会将对端的IP和端口信息 |
int FAR *namelen | 指定缓冲区的长度 |
返回值 | 成功为0,失败SOCKET_ERROR。 |
注意:该函数不是获取对端IP和端口的唯一方法。如果连接是本机主动发起,那些连接时就己知这些信息。如果连接是对方发起,在accept函数时,也可以得到对方的地址信息。 | |
②getsockname函数——获取本地端使用的IP地址和端口(特别是多网卡和系统自动选择端口时,可以通过该函数获知)。该函数也是将信息返回在sockaddr_in结构体中。
【其他网络函数测试程序】
#include <stdio.h>
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
#include<iostream>
#include<iomanip>
using namespace std;
//显示HOSTENT结构体的内容
void ShowHostEntInfo(HOSTENT* pHE)
{
int i = 0;
char** ppIpLst;
char** ppAlias;
SOCKADDR_IN stSa; memset(&stSa, 0, sizeof(SOCKADDR_IN));
stSa.sin_family = pHE->h_addrtype;
if(pHE->h_addrtype == AF_INET){//只处理IP4
cout << "正式主机名称:" << pHE->h_name << endl;
//主机可能有多个别名,分别打印出来
for(ppAlias = pHE->h_aliases, i = 0; *ppAlias != NULL; ppAlias++, i++){
cout << "别名" << i+1 << " : " << *ppAlias << endl;
}
//将IP地址打印出来
for(ppIpLst = pHE->h_addr_list, i = 0; *ppIpLst != NULL; *ppIpLst++, i++){
//取出来的IP,本身就是网络字节序的
stSa.sin_addr.S_un.S_addr = (ULONG)(*(int*)(*ppIpLst));
cout << "IP地址" << i+1 << " : " << inet_ntoa(stSa.sin_addr) << endl;
}
}
}
void NetTst()
{
WSADATA stWSA;
WSAStartup(MAKEWORD(2,0), &stWSA);
cout << "将域名(www.baidu.com)或主机名转化为IP地址:" << endl;
//通过gethostbyname将域名或主机名转化为IP地址
HOSTENT* pHE = gethostbyname("www.baidu.com");
if(pHE != NULL) ShowHostEntInfo(pHE);
cout << endl << endl << "将IP地址(127.0.0.1)转为主机名:" << endl;
ULONG uIp = inet_addr("127.0.0.1");
//通过gethostbyaddr将IP地址转为主机名
pHE = gethostbyaddr((char*)&uIp, 4, AF_INET);
if(pHE != NULL) ShowHostEntInfo(pHE);
cout << endl << endl << "通过gethostname获取本机主机名:" << endl;
char szBuff[32]; memset(szBuff, 0, sizeof(char)*32);
gethostname(szBuff, sizeof(szBuff));//获取本机主机名
cout << "主机名:" << szBuff << endl;
WSACleanup();
}

被折叠的 条评论
为什么被折叠?



