struct sockaddr与struct sockaddr_in的那些事

  笔者在最近的网络编程学习中,写过使用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 {

      sa_family_t    sa_family;   
       char           sa_data[14]; 

 }

 在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结构再传入系统调用函数中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值