总括内容
我们不妨先来看下tcp客户端/服务端程序的套接字函数
我们可以看到服务端的起始到结束包含了 socket()->bind()->listen()->read()<->write()->close()
而客户端则是socket()->connect()->write()<->read()->close()
接下来,我们顺着这个调用顺序,从socket开始讲解tcp套接字函数
socket函数
函数定义
socket函数在<sys/socket.h>里面,函数定义为
int socket(int family, int type, int protocol);
期中family是协议族,就是指示是使用IPv4还是IPv6或者一些更特殊的协议族,常用的主要是AF_INET,AF_INET6,分别表示IPv4和IPv6
type则是套接字类型,包括字节流套接字,数据包套接字等,常用的主要是SOCK_STREAM(常用于TCP),SOCK_DGRAM(UDP)
protocol是指特定的协议,因为family和protocol一般组合起来已经可以确定协议,所以可以填0表示使用默认值,不过也可以特别用来指定使用STCP等
常用套路
int tcp_fd=socket(AF_INET,SOCK_STREAM,0);//应用于IPv4协议采用tcp
int udp_fd=socket(AF_INET,SOCK_DGRAM,0);//应用于IPv4协议采用udp
具体解释
下面是family具体可取值以及解释
family |
意义 |
AF_INET |
IPv4协议 |
AF_INET6 |
IPv6协议 |
AF_LOCAL |
unix域协议 |
AF_ROUTE |
路由套接字 |
AF_KEY |
秘钥套接字 |
下面则是type具体可取值以及解释
type |
意义 |
SOCK_STREAM |
字节流套接字,常用于TCP |
SOCK_DGRAM |
数据包套接字,常用于UDP |
SOCK_SEQPACKET |
有序分组套接字,常用于SCTP |
SOCK_RAW |
原始套接字,可以认为是IP层 |
我们之前提到两两组合的可能性,下面是特定的family和type组合后的结果,空格表示不可组合
|
AF_INET |
AF_INET6 |
AF_LOCAL |
AF_ROUTE |
AF_KEY |
SOCK_STREAM |
TCP/SCTP |
TCP/SCTP |
可用 |
|
|
SOCK_DGRAM |
UDP |
UDP |
可用 |
|
|
SOCK_SEQPACKET |
SCTP |
SCTP |
可用 |
|
|
SOCK_RAW |
IPv4 |
IPv6 |
|
可用 |
可用 |
下面是protocol的具体取值,可以看到就是tcp,udp和sctp