socket-programme-in-c

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() ┤
│ │
tcp clientgithub.com/aeiouaoeiuv/recipes/blob/master/c_cpp/tcp_client.c
tcp servergithub.com/aeiouaoeiuv/recipes/blob/master/c_cpp/tcp_server.c

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() ┤
│ │
udp clientgithub.com/aeiouaoeiuv/recipes/blob/master/c_cpp/udp_client.c
udp servergithub.com/aeiouaoeiuv/recipes/blob/master/c_cpp/udp_server.c

AF & PF

  • AF : Address Family
  • PF : Protocol Family

如 : AF_INETPF_INET 的值是一样的,对于 BSDAFPOSIXPF

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 */
};