Linux C 网络编程——2. 基础

1. 地址存储结构

头文件 : netinet/in.h

IPv4:

[cpp]  view plain copy
  1. struct in_addr  
  2. {  
  3.     in_addr_t s_addr;   //uint32  
  4. };  

[cpp]  view plain copy
  1. struct sockaddr_in  
  2. {  
  3.     uint8_t     sin_len;  
  4.     sa_family_t sin_family;    //地址族  
  5.     in_port_t     sin_port;    //Port uint16  
  6.     struct in_addr    sin_addr;    //IP  
  7.     unsigned char     sin_sero[8];    //填充‘0’,  
  8. };  

sin_zero[8]的作用是为了保证sockaddr_in的大小是16 bytes,这样便于和sockaddr相互转换

[cpp]  view plain copy
  1. struct sockaddr  
  2. {  
  3.     uint8_t     sa_len;  
  4.     sa_family_t    sa_family;  
  5.     char         sa_data[14];  
  6. }  
sa_data = sin_port + sin_addr + sin_zero


2. IP转换 ——char <--> int

字符串转in_addr的函数:

[cpp]  view plain copy
  1. #include <arpa/inet.h>  
  2.   
  3. int inet_aton(const char *strptr, struct in_addr *addrptr);  
  4. in_addr_t inet_addr(const char *strptr);  
  5. int inet_pton(int family, const char *strptr, void *addrptr);  

in_addr转字符串的函数:

[cpp]  view plain copy
  1. char *inet_ntoa(struct in_addr inaddr);  
  2. const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);  

其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr,因此函数接口是void *addrptr。

domain : AF_INET, AFINET6

addr: 2进制IP

str : xxx.xxx.xxx.xxx

size: 3*4 + 3*1 + '0' = 16


3. 2`进制操作

void bzero( void *dest, size_t  nbytes );

void bcopy( const void *src, void *dest, size_t nbytes );

void (  const void *ptr , const void *ptr2, size_t nbytes );


4. 参考文献

[1] Linux 环境下C编程指南

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值