int socket(int domin, int type, int protocol) //Linux下创建套接字函数
SOCKET socket(int af, int type, int protocol) //Windows创建套接字函数
上边两个函数均是创建套接字的函数,其实这两个函数的形参都一样,这两个函数唯一不同的地方就在于函数的返回值类型不同。Windows上用SOCKET结构体保存返回值类型(其实可以用int,但为了以后的扩展性,就用SOCKET把)
这些的形参分别代表什么呢?
协议族
两个创建socket函数的第一个形参均为协议族,那么都有哪些协议族呢?
名称 | 协议族 |
---|---|
PF_INET | IPv4互联网协议族 |
PF_INET6 | IPv6互联网协议族 |
PF_LOCAL | 本地通信的UNIX协议族 |
PF_PACKET | 底层套接字的协议族 |
PF_IPX | IPX Novell协议族 |
套接字类型
函数中的第二个参数,指的就是套接字类型,套接字类型有一下几个:
面向连接的套接字(SOCK_STREAM)
面向连接的套接字有以下特点:
1. 传输过程中数据不会消失
2. 按序传输数据
3. 传输的数据不存在数据边界
面向消息的套接字(SOCK_DGRAM)
特点如下:
1. 强调快读传输而非顺序传输
2. 传输的数据可能丢失也可能损毁
3. 传输的数据有数据边界
4. 限制每次传输的数据大小
什么是数据边界
收发数据的套接字内部有缓冲(buffer),通过套接字传输的数据将保存到此处。因此收到数据并不意味着马上读取数据,有可能在缓冲区充满后一次性取走,也有可能多次读取。
第三个参数
这个参数决定最终采用的协议,虽然前两个参数已经设定了协议族和套接字数据传输方式,但是同一个协议族中很可能有多个传输方式一样的协议,此时,我们就需要制定协议了,例如:
TCP协议 : IPPROTO_TCP
UDP协议 : IPPROTO_UDP