套接字地址结构
1.IPv4地址结构
#include<netinet/in.h>
struct in_addr{
in_addr_t s_addr; /*32-bit length*/
};
struct sockaddr_in {
uint8_t sin_len;//结构的长度
sa_family_t sin_family;//协议族 AF_INET
in_port_t sin_port;//16-bit port number
struct in_addr sin_addr;//ip 地址
char sin_zero[8];
};//16字节
2.通用套接字地址结构
#include<sys/socket.h>
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
/*一些套接字函数必须处理来自所支持的任何协议族的套接字地址结构, 因此定义通用套接字地址结构*/
3.IPv6地址结构
<netinet/in.h>
struct in6_addr{
uint8_t s6_addr[16];
};
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; /* 对于具备范围的地址,标识其范围 */
};//28字节
4.新的通用套接字地址结构
#include<netinet/in.h>
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
};//系统中最大长度
/*新的通用套接字地址结构能够满足最苛刻的对齐要求,其次它足够大,能容纳任何套接字地址结构*/
/*其他字段对用户是透明的,必须强制类型转换才能使用*/
5.value-result
从进程传递到内核,长度使用值(value)传递『bind, connect, sendto』,而从内核到进程『accept, rcvfrom, getsockname, getpeername』,内核写结果(result)到指针所指区域。
6.字节排序函数
#include<netinet/in.h>
uint16_t htons (uint16_t host16bitvalue);
uint32_t htonl (uint32_t host32bitvalue);
uint16_t ntohs (uint16_t nerwork16bitvalue);
uint32_t ntohl (uint32_t nerwork32bitvalue);
/*h:host, n:network, s:short, l:long*/
7.字节操纵函数
#include<strings.h>
void bzero (void *dest, size_t nbytes);//将目的字串指定数目的位置置为0
void bcopy (const viod *src, void *dest, size_t nbytes);//将指定数目的原字节串复制到目的字节串
int bcmp (const void *ptr1, void *ptr2, size_t nbytes);//比较任意两个字节串,若相同返回0,不同返回非0
//ANSI C
#include<string.h>
void *memset (void *dest, int c, size_t len);//把目标字串指定数目的字节置为c
void *memcpy (void *dest, const void *src, size_t nbytes);//类似bcopy,但是源字串与目标字串重叠是结果不可知,而bcopy能正确处理
int memcmp (const void *ptr1, const void *ptr2, size_t nbytes);//类似bcmp
8.地址转换函数
#include<arpa/inet.h>
int inet_pton(int family, const char* ptr, void *addrptr);
//将表达(presentation)转换为数值(numberic),成功返回1,若输入的不是有效的表达式格式返回0,出错返回-1
const char *inet_ntop(int family, const void*addptr, char *ptr, size_t len);
//将数值转换为表达,成功返回指向结果的指针,否则为NULL. len 为目标存储单元大小,以免溢出。在<netinet/in.h>下定义了#define INET_ADDRSTRLEN 16; #define INET6_ADDRSTRLEN 46用于指定这个大小
//family为地址族,若传入不被支持的地址族,则errno被设置为EAFNOSUPPORT
9.读写字节流套接字
字节流套接字上调用read和write输入输出的字节数可能少于请求的数量,因为内核中用于套接字的缓冲区已经满了,此时需要再次调用