前言
这篇文章主要是Unix网络编程卷一第三章的个人笔记
1.POSIX 规范的三个字段
- sin_family
- sin_addr
- sin_port
2.IPV4 套接字结构
五个套接字结构
IPV4(sockaddr_in) IPV6(sockaddr_in6) Unix(sockaddr_un)数据链路(sockaddr_dl) 存储(sockaddr_storage)
in_addr | sockaddr_in | sockaddr | |
---|---|---|---|
inaddr _t s_addr | uint_8 sin_len | uint_8 sa_len | |
32-bit IPV4 address | sa_family_t sin_family(AF_INET) | sa_family_t sa_family | |
network byte ordered | in_port_t sin_port | char sa_data[14] | |
struct in_addr sin_addr | |||
char sin_zero[8] | |||
<netinet/in.h> | <netinet/in.h> | <sys/socket.h> | |
IPV4网际套接字地址结构 | IPV4网际套接字地址结构 | 通用套接字地址结构 |
数据类型 | 说明 | 头文件 |
---|---|---|
sa_family_t | 套接字地址结构的地址族(无符号整数) | <sys/socket.h> |
socklen_t | 套接字地址结构的长度,uint32_t | <sys/socket.h> |
in_addr_t | IPV4地址,uint_32 | <netinet/in.h> |
in_port_t | TCP/UDP 端口,uint16_t | <netinet/in.h> |
数据类型 | 说明 | 头文件 |
---|---|---|
int8_t | 带符号的8位整数 | <sys/types.h> |
uint_8 | 不带符号的8位整数 | <sys/types.h> |
int16_t | 带符号的16位整数 | <sys/types.h> |
uint16_t | 不带符号的16位整数 | <sys/types.h> |
int32_t | 带符号的32位整数 | <sys/types.h> |
uint32_t | 不带符号的32位整数 | <sys/types.h> |
3.字节操纵函数
strings.h | string.h |
---|---|
void bzro(void *dest,size_t nbytes) | void *memset( void *dest ,int c , size_t len) |
void bcopy( const void *src, void *dest, size_t nbytes) | void *memcpy( void *dest, const void *src ,size_t nbytes) |
int bcmp (const void *ptr1 ,const void *ptr2 , size_t nbytes ) | int mencmp (const void *ptr1 , const void *ptr2 ,size_t mbytes) |
4.inet的三个函数
- int inet_aton( const *strptr, struct in_addr *addrptr) 将字符串转化为32位的网络字节序二进制值
- in_addr_t inet_addr ( const char *strptr) 判断字符串是否有效(IP地址)
- char * inet_ntoa ( struct in_addr inaddr) 返回一个点十分制IP地址的指针
- <arpa/inet.h>
5.inet_pton 和inet_ntop
<arpa/inet.h>
两个函数都可以用于IPV4和IPV6,p表示字符串 & n表示二进制值
AF_INET和AF_INET6
函数介绍
- int inet_pton ( int family , const char *strptr ,void *addrptr ) strptr ===>addrptr ? 1 : 0
- const char *inet_ntop ( int family , const void *addrptr , char *strptr ,size_t len);
6.读取和写入
存在的问题
字节套接字上调用read或write输入或输出的字节数可能比请求的数量少
返回的长度小于所请求的长度
解决的一个思路:阻塞读或者写