socket编程几个结构

socket程序编码流程很简单,那几个地址结构体、函数接口容易混淆,经常搞不清,以下是个人理解总结。
1) Socket相关结构体
这些结构体最初是给ipv4地址定义的,后来兼容ipv6对结构体、函数做了扩展
Ipv4网络地址:
struct in_addr {
   u_int32_t s_addr;   
};
Ipv6网络地址:
struct in6_addr {
       u_int8_t  s6_addr[16]; 
}
 通用socket地址,几乎所有socket函数都使用该类型,通过另一个参数(int len)指定实际对应的是ipv4还是ipv6地址,共16字节:
struct sockaddr {
    sa_family_t     sa_family;     
    char            sa_data[14];   
};
sockaddr 对应到ipv4网络地址,16字节:
struct sockaddr_in {
  short int sin_family;
  unsigned short int sin_port;
  struct in_addr sin_addr;
  unsigned char sin_zero[8];
};
sockaddr 对应到ipv6网络地址,24字节:
struct sockaddr_in6{
sa_family_t sin6_family; //地址簇类型,为AF_INET6
in_port_t sin6_port; //16 位端口号,网络字节序
uint32_t sin6_flowinfo; //32 位流标签
struct in6_addr sin6_addr; //128 位IP 地址 (新版本可能会多4字节scope id, RFC2553)
}
 

2) 相关函数:
 IPV6,IPV4兼容的字符串地址和网络地址(in_addr/in6_addr)的转换函数:
char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size);
int inet_pton(int af, const char *restrict src, void *restrict dst);
两个地址长度的宏
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
主机字节序到网络字节序间的转换函数:
uint16_t htons(uint16_t hostshort);
uint16_t ntohs(uint16_t netshort);
uint32_t htonl(uint32_t hostlong);
uint32_t ntohl(uint32_t netlong);
获取网络地址信息(addrinfo)函数:
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
void freeaddrinfo(struct addrinfo *res); //调用时机:在bind或connect之后就可以释放该内存
addrinfo 是一个链表,保存本机所有的ip地址信息,每个节点32字节:
typedef struct addrinfo { 
int ai_flags; 
int ai_family; 
int ai_socktype; 
int ai_protocol; 
size_t ai_addrlen; 
char* ai_canonname; 
struct sockaddr* ai_addr; 
struct addrinfo* ai_next;
}
Socket句柄获取网络地址:
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int getpeername(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值