<>1、创建套接字
#include <sys/socket.h> int socket(int domain,int type,int protocol);
* domain:套接字中使用的协议族(protocol family)信息
* type:套接字数据传输类型信息
* protocol:计算机间通信中使用的协议信息
<>2、协议族
* 常用PF_INET,即ipv4
<>3、套接字类型
(1)面向连接的套接字(SOCK_STREAM)
* 特点:
* 传输过程中数据不会消失
* 按序传输数据
* 传输的数据不存在数据边界:即接收端存在缓冲区,多次写入缓冲区的数据,接收端可能一次就能读完(即传输数据次数和接收数据次数可以不一样)
* 一一对应,基于字节传输
套接字缓冲满是否意味数据丢失?
* 当套接字缓冲满时,传输端停止传输,也就是说面向连接的套接字会根据接收端的状态传输数据。
* 若传输出错还会提供重传服务,故除特殊情况外不会发生数据丢失
(2)面向消息的套接字(SOCK_DGRAM)
* 特点:
* 强调快速传输而非传输顺序(故速度比面向连接快,且不按序)
* 传输数据可能丢失也可能损毁
* 传输数据有数据边界(接收数据次数和传输次数相同)
* 限制每次传输的数据大小
<>4、协议最终选择
* 一般情况下,传递前两个参数既可创建所需套接字,故可以直接传0.
* 但是可能出现在同一协议族中存在多个数据传输方式相同的协议,此时就要传入第三个参数具体指定协议信息。
* 例: //创建ipv4版tcp连接socket int tcp_socket=socket(PF_INET,SOCK_STREAM,
IPPROTO_TCP);//IPPROTO_TCP可以直接写0 //创建ipv4版udp连接socket int udp_socket=socket(
FP_INET,SOCK_STREAM,IPPROTO_UDP);
<>5、习题
* 什么是协议?在收发数据中定义协议有何意义?
协议就是为了完成数据交换而定好的约定。因此,定义协议意味着对数据传输所必需的的承诺进行定义。
* 面向连接的TCP套接字传输特性有3点,请分别说明.
* 有序传输
* 数据传输时没有数据边界
* 传输过程中数据不会消失
* 何种类型的套接字不存在数据边界?这类套接字接收数据时需要注意什么?
面向连接的套接字不存在数据边界。因此输入输出函数的响应次数不具有意义。重要的不是函数的响应次数,而是数据的收发量
。因此,必须将传输数据的量和接收数据的量制作成编码,保证发送数据的量和接收数据的量是一致的,特别要注意是制作依赖函数响应次数判断代码