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);
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);
相关文章推荐
- socket结构和几个IP地址转换函数
- 纯socket编程有几个步骤
- 成功实现Linux下Socket编程中用send发送结构体
- Socket编程中用send发送结构体
- socket结构和几个IP地址转换函数
- 网络socket编程几个函数小结
- socket编程中最常用的几个数据类型和转换函数
- socket编程常用的几个函数
- Socket编程中传递结构体
- socket编程总结(三) struct sockaddr_in /struct sockaddr_in6/struct addrinfo 结构体
- ipv4 ipv6 socket 编程相关结构
- 结构协议[网络编程]socket创建流程
- socket编程的几个概念.同步,异步,阻塞,非阻塞
- socket结构和几个IP地址转换函数
- socket编程几个函数小结
- Beej网络socket编程指南——相关结构(3)
- Linux下Socket编程中用send发送结构体
- 六、Linux网络编程-socket、套接字地址结构、地址转换、字节序、套接字类型
- socket编程中相关数据结构
- Linux下Socket编程之地址结构