套接字编程
网际套接字地址结构,以sockaddr_in命名,定义在<netinet/in.h>
struct in_addr {
in_addr_t s_addr; /* 32位 IPv4 地址*/
};
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_addr;
struct in_addr sin_addr;
char sin_zero[8];
};
通用套接字地址结构
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
IPv6套接字地址结构
struct in6_addr {
uint8_t s6_addr[16];
};
#define SIN6_LEN
struct sockaddr_in6 {
uint8_t sin6_len;
sa_family_t sin6_family; /*AF_INET6*/
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
}
/////////主机字节序和网络字节序之间的相互转换////////////////////
#include<netinet/in.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue); //均返回:网络字节序的值
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue); //均返回:主机字节序的值
h代表host, n代表network, s代表short, l代表long.
////////////////////////////////////////////////////////////////////////
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct int_addr *addrptr);
inet_aton将strptr所指C字符串换成一个32位的网络字节序二进制,并通过指针addptr来存储。若成功返回1,否则返回2.
char *inet_ntoa(struct in_addr inaddr);
inet_ntoa函数将一个32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。
#include<arpa/inet.h>
int inet_pton(int family, char *strptr, void *addrptr);
p和n分别代表表达(presentation)和数值(numberic),inet_pton转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
inet_pton进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。