2 套接字类型与协议设置
这一节和 socket 函数有关
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
// success 文件描述符,fail -1
// domain 套接字使用的协议族信息,type 套接字数据传输类型信息,protocol 通信使用的协议
协议族
socket 函数第一个参数传递套接字使用的协议分类信息。在 sys/socket.h 中分类如表
| 名称 | 协议族 |
|---|---|
| PF_INET | IPv4 互联网协议族 |
| PF_INET6 | IPv6 互联网协议族 |
| PF_LOCAL | 本地通信的 UNIX 协议族 |
| PF_PACKET | 底层套接字的协议族 |
| PF_IPX | IPX Novell 协议族 |
套接字实际采用的协议是由第三个参数决定的,在指定的范围内通过第一个参数决定第三个
套接字类型
type 规定数据传输方式,同一个协议族其实有不同的传输方式
面向连接的套接字 SOCK_STREAM
- 传输过程中数据不会消失
- 按序传输数据
- 传输的数据不存在数据边界
收发数据的套接字内部有缓冲,传输的数据会被保存到该字符数组。收到数据以后不马上读取,可以在数据填满缓冲区以后用一次 read 读取全部,也可以多次读取。也就是说在这种传输方式中,读写次数意义不大
面向消息的套接字 SOCK_DGRAM
- 强调快速传输而非顺序
- 传输的数据可能丢失/损毁
- 传输数据有数据边界
- 限制每次传输的数据大小
以高速传输为目的
使用协议
大部分情况传递前两个参数就能创建套接字,第三个可以传 0,除非同一协议族存在多种传递方式相同的套接字
例如,IPv4 协议族中面向连接的套接字只有 IPPROTO_TCP
IPv4 协议族面向消息的套接字满足的只有 IPPROTO_UDP