概述
笔者在最近的网络编程学习中,写过使用UDP协议的echo服务程序。其中在提取int recvfrom(int sockfd ,void *buffer,size_t len,int flags,struct sockaddr * from,socklen_t *fromlen)函数调用后获得的客户端IP信息时,使用char inet_ntoa(struct in_addr in)将from变量中存储的客户端IP地址信息转化为字符时,有些茫然。由此,感觉有必要探究一下struct sockaddr与struct sockaddr_in两种类型的渊源。
通过查看图书(unix network prgramming)和上网,现将知识总结如下:
在linux环境下,结构体structsockaddr在/usr/include/linux/socket.h中定义,具体如下:
typedef unsigned short sa_family_t;
struct sockaddr {
在linux环境下,结构体structsockaddr_in在/usr/include/netinet/in.h中定义,具体如下:
struct sockaddr_in
{
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */ /*sin_zero之所以定义为8个字节的数组,是为了保证和struct sockaddr一样大,便于相互转换*/
};
struct sockaddr是通用的套接字地址,而structsockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。
最后
以上就是大意路灯为你收集整理的struct sockaddr与struct sockaddr_in的那些事的全部内容,希望文章能够帮你解决struct sockaddr与struct sockaddr_in的那些事所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复