socket()函数:协议及其数据传输特性

socket协议及其数据传输特性

协议 Protocol


先来看一眼,创建socket

#include 
// domain: socket中使用的协议族(Protocol Family)信息
// type: socket中传输信息的类型
// protocol: 通信中使用的协议
int socket(int domain, int type, int protocol);

int domain: socket中使用的协议族(Protocol Family)信息,有如下几类:

  • PF_INET : IPv4协议族
  • PF_INET6 : IPv6协议族
  • PF_LOCAL : 本地通信的UNIX协议族
  • PF_PACKET : 底层socket的协议族
  • PF_IPX : IPX Novell协议族

socket中实际采用的协议是协议族中的某个协议,由第三个参数传递的

int type: socket中传输信息的方式(类型),(一个协议可能多个数据传输方式,所以需要指定),以下是具有代表的2种方式:

1、 SOCK_STREAM: 面向连接的socket

  • 数据传输过程中不会丢失
  • 按序传输数据(较晚传递的数据不会先到达)
  • 传输的数据不存在边界(Boundary),(“100个糖果是分批传递的,但接收者凑齐100个后才装袋”)
  • 在该种传输方式中,read和write函数调用次数并无太大意义。传输数据的会保存到socket内部的buffer缓冲(字节数组),所以收到数据之后,并不意味马上调用read函数进行读取,也因此socket没有数据边界
  • 此外,如果缓冲填满了,会暂停传输数据,同时若传输出错还会提供重传服务
  • “socke的连接必须是一一对应的”

2、SOCK_DGRAM: 面向消息的socket

  • 强调快速传输而非传输顺序
  • 数据可能丢失也可能损坏 ?
  • 数据有数据边界 ?-> 接受次数和发送次数相同
  • 限制每次传输数据的大小
  • “可以比喻成高速移动的摩托车快递”
  • “如果是大包裹,需要分批传送”
  • “这个不存在连接的概念”

3、int protocol: 通信中使用的协议,是协议的最终选择

  • 前两个参数即可创建所需的socket,大部分情况第三个参数传递0
  • 但是“同一协议族中存在多个数据传输方式相同的协议,用哪个?”

示例:

#include 
// IPv4协议族中面向消息的套接字
int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

你可能感兴趣的:(socket,unix,网络,服务器)