为了使不同格式能够传入到套接字函数中,地址将会被转化为一个通用的地址结构sockaddr:
struct sockaddr{
sa_family_t sa_family;
char sa_data[];
...
};
在IPv4因特网俞中(AF_INET)中,套接字地址用结构sockaddr_in表示
struct in_addr{
in_addr_t s_addr;//IPv4 address, uint32_t
};
struct sockaddr_in{
sa_family_t sin_family;// address familt
in_port_t sin_port;// port number, uint16_t
struct in_addr sin_addr;// IPv4 address
};
char* inet_ntoa(struct in_addr)和 in_addr_t inet_addr(char *)通过这两个函数可以实现二进制地址格式与点分十进制字符表示(a.b.c.d)之间相互转化。但是其只是支持ipv4。
而新函数inet_ntop和inet_pton具有相似的功能,但是其同时支持IPV4和IPV6地址
long atol(const char *nptr)
{
int c; /* current char */
long total; /* current total */
int sign; /* if ''-'', then negative, otherwise positive */
/* skip whitespace */
while ( isspace((int)(unsigned char)*nptr) ) //int isdigit(int ),所以需要强制转化
++nptr;
c = (int)(unsigned char)*nptr++;
/* 此语句等效于
c = (int)(unsigned char) (*nptr);
nptr++;
*/
sign = c; /* save sign indication */
if (c == '-' || c == '+')
c = (int)(unsigned char)*nptr++; /* skip sign , get the first char*/
total = 0;
while (isdigit(c)) {
total = 10 * total + (c - '0'); /* accumulate digit */
c = (int)(unsigned char)*nptr++; /* get next char */
}
if (sign == '-')
return -total;
else
return total; /* return result, negated if necessary */
}
inet_ntop 将网络字节序的二进制地址转化为文本字符串格式
参数size指定了保存文本字符串的缓冲区(str)大小。两个常用的简化参数INET_ADDRSTRLEN定义一篇足够大的空间来存放一个表示IPV4地址的文本字符串;INET_ADDRSTRLEN6定义一篇足够大的空间来存放一个表示IPV6地址的文本字符串
inet_pton 将文本字符串格式转化为网络字节序的二进制地址
如果domain是AF_INET,则缓冲区addr需要足够大的空间来存放一个32位地址,如果domain是AF_INET6,则需要足够大的空间来存放128位地址
以下函数返回的网络配置信息被存放许多地方。如(/etc/hosts和/etc/servers中),也可以由名字服务器管理,如域名系统和网络信息服务
通过调用gethostent,可以找到给定计算机系统的主机信息:
#include <netdb.h>
struct hostent* gethostent(void); //成功则返回指针,出错返回NULL。
void sethostent(int stayopen);
void endhostent(void);
如果主机数据库文件没有打开,那么gethostent会打开它。函数gethostent返回文件中的下一个条目。函数sethostent会打开文件,如果文件已经被打开,那么将其绕回。当stayopen参数设置为非0时,调用gethostent之后,文件将依然打开。函数endhostent可以关闭文件。
gethostent返回时, 会得到一个纸箱hostlent结构的指针,该结构可能包含一个静态的数据缓冲区,当再次调用函数gethostent的时候,该缓冲区的数据会被覆盖,hostent成员至少包括以前成员
struct hostent{
char *h_name;// name of host
char **h_aliases;// pointer to alternate host name array
int h_addrtype;// address type (AF_INET 等)
char **h_addr_list;//pointer to array of network addresses
....
};
返回的地址采用网络字节序