您的位置:首页 > 编程语言

socket编程几个结构

2013-11-12 23:56 309 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: