常用POSIX数据类型
数据类型 | 说明 | 头文件 |
---|---|---|
int8_t | 带符号的8位整数 | <sys/types.h> |
uint8_t | 无符号的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> |
sa_family_t | 套接字地址结构的地址族,可以是任何无符号整型 | <sys/socket.h> |
socklen_t | 套接字地址结构的长度,一般为uint32_t | <sys/socket.h> |
in_addr_t | IPv4地址,一般为uint32_t | <netinet/in.h> |
in_port_t | TCP或UDP端口,一般为uint16_t | <netinet/in.h> |
套接字地址结构
IPv4套接字结构
IPv4的地址结构是struct sockaddr_in
,定义在<netinet/in.h>
头文件中:
1 | struct in_addr { |
POSIX规范只需要结构中的3个字段:sin_family
、sin_addr
和sin_port
。
良好的习惯是在使用struct sockaddr_in
之前将整个结构置为0。
通用套接字结构
<sys/socket.h>
头文件中定义通用套接字结构地址:
1 | struct sockaddr { |
案例:
1 | struct sockaddr_in serv; |
IPv6套接字结构
IPv6结构是struct sockaddr_in6
,定义在<netinet/in.h>
头文件中:
1 | struct in6_addr{ |
新的通用套接字结构
struct sockaddr_storage
定义在<netinet/in.h>
中:
1 | struct sockaddr_storage { |
struct sockaddr_storage
能够容纳系统所支持的任何套接字地址结构。
字节序
网络协议使用大端字节序传输数据。
1 |
|
h表示host,n表示net,s表示short,l表示long。
字节操作函数
有两组操作字节的函数,它们不对数据做解释,也不假设数据是以空字符结束的字符串。
名字以b开头的一组函数起源于4.2BSD:
1 |
|
名字以mem开头的一组函数起源于ANSI C标准:
1 |
|
地址转换函数
只适用于IPv4
inet_aton
, inet_addr
和inet_ntoa
只适用于IPv4进行点分十进制(例如:”206.168.112.96”)转换为网际地址和网际地址转换为点分十进制。函数定义在<arpa/inet.h>
中。
1 |
|
通用地址转换
inet_pton
和inet_ntop
对于IPv4和IPv6都适用,p(presentation)表示”表达”,n表示”数值”。
1 |
|
套接字编程
socket函数
1 |
|
family常值:
family | 说明 |
---|---|
AF_INET | IPv4协议 |
AF_INET6 | IPv6协议 |
AF_LOCAL | Unix域协议 |
AF_ROUTE | 路由套接字 |
AF_KEY | 密钥套接字 |
type常值:
type | 说明 |
---|---|
SOCK_STREAM | 字节流套接字 |
SOCK_DGRAM | 数据报套接字 |
SOCK_SEQPACKET | 有序分组套接字 |
SOCK_RAW | 原始套接字 |
connect函数
1 |
|
bind函数
1 |
|
listen函数
1 |
|
accept函数
1 |
|
close函数
1 |
|