头文件 #include <sys/socket.h>
int socket(int family, int type, int protocol)
一个进程必须做的事情就是调用 socket 函数 指定期望的通信协议类型。
该函数返回一个文件描述符 就是 sockfd 。用于本进程的 套接字通信 本进程结束 才释放 (close(sockfd)),
如果不指定第三个参数 一般 就写 一个 0 默认的 就可以了。
并非所有的 family 和 type 的组合都是有效的。
先来指出每个参数的类型 后面再 讨论组合。
family:
1: AF_INET (IPV4)
2:AF_INET6 (IPV6)
3:AF_LOCAL (UNIX域协议)
4:AF_ROUTE (路由套接字)
5:AF_KEY (密钥套接字)
type:
1:SOCK_STREAM (字节流套接字)
2:SOCK_DGRAM (数据报套接字)
3:SOCK_SEQPACKET (有序分组套接字)
4:SOCK_RAW (原始套接字)
protocol:
1:IPPROTO_TCP (tcp传输协议)
2:IPPROTO_UDP (udp传输协议)
3:IPPROTO_SCTP (sctp传输协议)
声明一下 这个 SCTP 是比较新的协议 也是一个面向连接的协议 这里我们不做探讨
family与type的正确组合关系
1:AF_INET(TCP / SCTP) SOCK_STREAM
2:AF_INET(UDP) SOCK_DGRAM
3:AF_INET(SCTP) SOCK_SEQPACKET
4:AF_INET(IPV4) SOC_RAW
5:AF_INET6(TCP / SCTP) SOCK_STREAM
6:AF_INET6(UDP) SOCK_DGRAM
7:AF_INET6(SCTP) SOCK_SEQPACKET
8:AF_INET6(IPV6) SOC_RAW
AF_LOCAL ------- SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET
AF_ROUTE -------- SOCK_RAW
AF_KEY --------- SOCK_RAW