地址格式和地址查询

为了使不同格式能够传入到套接字函数中,地址将会被转化为一个通用的地址结构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 */  
} 
domain 仅支持两个值 AF_INET和AF_INET6

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

....

};

返回的地址采用网络字节序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值