tcp
SOCK_STREAM
: 数据流,使用 tcp
协议,保证传输正确性和顺序性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ┌────────┐ ┌────────┐ │ Server │ │ Client │ ├────────┘ └────────┤ │ │ ├ socket() socket() ┤ │ │ ├ bind() │ │ │ ├ listen() │ │ │ ├ accept() connect() ┤ │ │ │---------------------------------│ │ │ ├ recv() send() ┤ │ │ ├ send() recv() ┤ │ │ │---------------------------------│ │ │ ├ close() close() ┤ │ │
|
udp
SOCK_DGRAM
: 数据报,使用 udp
协议,数据相互独立且无序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ┌────────┐ ┌────────┐ │ Server │ │ Client │ ├────────┘ └────────┤ │ │ ├ socket() socket() ┤ │ │ ├ bind() │ │ │ │---------------------------------│ │ │ ├ recvfrom() sendto() ┤ │ │ ├ sendto() recvfrom() ┤ │ │ │---------------------------------│ │ │ ├ close() close() ┤ │ │
|
AF & PF
AF
: Address Family
PF
: Protocol Family
如 : AF_INET
和 PF_INET
的值是一样的,对于 BSD
是 AF
; POSIX
是 PF
。
1 2 3 4 5 6 7 8 9 10 11 12 13
| # from [man 2 socket]
Name Purpose Man page AF_UNIX, AF_LOCAL Local communication unix(7) AF_INET IPv4 Internet protocols ip(7) AF_INET6 IPv6 Internet protocols ipv6(7) AF_IPX IPX - Novell protocols AF_NETLINK Kernel user interface device netlink(7) AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7) AF_AX25 Amateur radio AX.25 protocol AF_ATMPVC Access to raw ATM PVCs AF_APPLETALK Appletalk ddp(7) AF_PACKET Low level packet interface packet(7)
|
sockaddr
它的作用只是用来强制转换,以避免编译告警。
1 2 3 4 5 6
| // from [man 2 bind]
struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ }
|
sockaddr_in
网络编程使用该结构体,需强制类型转换为 sockaddr
以避免编译告警。
1 2 3 4 5 6 7 8 9 10 11 12
| // from [man 7 ip]
struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ };
/* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ };
|
sockaddr_un
本地进程间通信使用该结构体,需强制类型转换为 sockaddr
以避免编译告警。
e.g. : socket(AF_UNIX/AF_LOCAL, SOCK_STREAM/SOCK_DGRAM, 0)
,不应使用 AF_INET/PF_INET
。
1 2 3 4 5 6 7 8
| // from [man 7 unix]
#define UNIX_PATH_MAX 108
struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* pathname */ };
|