2.1套接字协议以及其数据传输特性
协议就是为了完成数据交换而定好的约定。
#include <sys/socket.h>
//创建套接字,成功时返回文件描述符,失败返回-1
//domain 套接字中使用的协议族信息(Protocol Family),type套接字数据传输类型信息,protocol协议信息
int socket(int domain,int type,int protocol);
domain 传递套接字中使用的协议分类信息,此协议分类信息称为协议族
本书将着重讲解表2-1中PF_INET对应的IPv4互联网协议族。
其他协议族并不常用或尚未普及,因此本书将重点放在PFINET协议族上。
另外,套接字中实际采用的最终协议信息是通过socket函数的第三个参数传递的。
在指定的协议族范围内通过第一个参数决定第三个参数。
套接字类型(Type)
套接字类型指的是套接字的数据传输方式,通过socket函数的第二个参数传递,只有这样才能决定创建的套接字的数据传输方式。
这种说法可能会使各位感到疑惑。已通过第一个参数传递了协议族信息,还要决定数据传输方式?问题就在于,决定了协议族并不能同时决定数据传输方式,换言之,socket函数第一个参数PF_INET协议族中也存在多种数据传输方式。
套接字类型1:面向连接的套接字(SOCK_STREAM)
特点如下:
1.传输过程中数据不会消失。
2.按序传输数据。
3.传输的数据不存在数据边界。(100个糖果是分批传递的,但接收者凑齐100个后才装袋。)好比(传输数据的计算机通过3次调用write函数传递了100字节的数据,但接收数据的计算机仅通过1次read函数调用就接收了全部100个字节。)
4.套接字连接必须一一对应。
一句话概括就是“可靠的、按序传递的、基于字节的面向连接的数据传输方式的套接字”。
面向连接的套接字除特殊情况外不会发生数据丢失。
套接字类型2:面向消息的套接字(SOCK_DGRAM)
第二个传递参数时SOCK_DGRAM,则创建面向消息的套接字。
特点如下:
1.强调快速传输而非传输顺序
2.传输的数据可能丢失也可能损坏
3.传输的数据有数据边界(存在数据边界意味着接收数据的次数应和传输次数相同。)
4.限制每次传输的数据大小
总结:不可靠的、不按序传递的、以数据的高速传输为目的的套接字
协议的最终选择
socket函数的第三个参数,该参数决定最终采用的协议。
面向连接的套接字:TCP套接字示例
验证 TCP套接字 传输的数据不存在数据边界的特性即write函数的调用次数不同于read函数的调用次数。
客户端中分多次调用read函数来接受服务器端发送的全部数据。
2.2Windows平台下的验证以及验证
#include <winsock2.h>
//成功时返回socket句柄 失败时返回INVAL_SOCKET
SOCKET socket(int af,int type,int protocol);
参数和Linux一样,只有返回值不一样
SOCKET此结构体用来保存整数型套接字句柄值。
以后即可将SOCKET视作保存套接字句柄的一个数据类型。(整型)
基于Windows的TCP套接字示例