我们首先来说一下PF_INET和AF_INET,虽然标准提倡在指定demain参数的时候,优先使用PF_INET,但是大量已经编写的c代码遵循旧的协议。目前情况是AF_UNIX=PF_UNIX,AF_INET=PF_INET。但是将来是不是这样不好说啊。

不同于socketpari函数的demain参数只能指定为PF_LOCAL,socket函数可以用于生成所支持的任何协议族的套接口,语法如下:

#include <sys/types.h>
#include <sys/socket.h>int socket(int demain, int type , int protocol);

编程者通常为type参数取值如下:

SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW.

当编程者想在远程套接口上实现I/O的时候,就可以使用SOCK_STREAM套接口选项。字节流中没有分界线,也没有边界,没有记录的长度或者块的大小,在接受端也不存在分组的概念,在接受端获得的所有的数据都返回到调用者的缓冲区中。

上面可能说的不清楚,我们在详细的解释一下:加入本地主机想通过两次独立write调用远程主机发送数据,过程如下:

1.本地进程写入25字节,然后发送到远程进程。

2.本地进程在写入30个字节,然后发送到远程进程。

3.远程进程从套接口接收数据,接受缓冲区最大为256字节,接受进程共收到2次发送的55个字节。

也就是说本地进程执行了俩次独立的操作,可能写入了2个不同的消息或者数据结构,但是远程进程并不关心本地进程进行了几次写操作。她只是将这55个字节作为一个整体来看待。

从上可以看出,一个流套接口不会保留任何的消息边界,她只是简单地向接收进程返回他所拥有的数据。

       流套接口的另外一个重要的性质是有序性。她可以保证把字节按照写入的顺序发送到接受端。SOCK_STREWAM套接口可以确保接收程序完全按照数据发送的顺序进行接收。

       下面总结一下SOCK_STREAM性质:

         1. 不保留消息边界。2.保证接收字节顺序和发送的顺序一致。3.保证写入的数据在接受端被无错的接收。如果有错误发生,在尝试玩所有的错误恢复措施之后,如果还是无法消除错误,那么流套接口就会回报错误。4.数据是通过一对连接的套接口传输的,SOCK_STREAM意味着在通信之前必须建立一个连接。

下面我们来谈谈SOCK_DGRAM类型:

       在不需要考虑数据绝对有序性和可靠性的时候,我们可以使用SOCK_DGRAM。下面是她的一些性质:

1.分组发送后可能无序到达接受端。2.分组可能丢失。丢失了也不会采取措施补救,接受端也不知道有丢失。3.数据报分组有大小尺寸的限制,如果超出限制,在某些路由器或者节点上无法传送。4.分组在不建立连接的情况下被发送到远程的,这个也就容许本地进程每次将消息发送给不同IP地址上同样的端口。

需要注意的是并不是每个协议族都可以使用所有的套接口类型,例如PF_INET支持SOCK_STREAM,但是不支持SOCK_SEQPACKET类型。

选择协议

事实上,我们很少设定protocol参数的值,而只是简单的设置为0 ,这个时候,Linux内核就会根据其他参数的情况自动选择一个正确的协议。但是一些编程者习惯于明确的描述protocol参数的值,这个对于需要特定协议支持的程序来说很重要。

使用PF_LOCAL和SOCK_STREAM

在函数socket和socketpair中,对于PF_LOCAL套接口,我们可以对protocol参数使用0值,这个是protocol参数唯一支持的值。因为到目前为止,如果函数socket和socketpair函数的domain参数为PF_LOCAL/PF_UNIX的时候,protocol的参数的唯一有效值为0.

使用PF_LOCAL和SOCK_DGRAM

     当需要保留消息边界的时候,我们可以在本地套接口上使用SOCK_DGRAM,在domain参数为PF_LOCAL的SOCK_DGRAM套接口中,protocol参数的唯一有效值为0、

     PS:套接口生成以后,他还处于“无名”状态,就是说还没有地址,编程者必须建立一个有效的地址,并通过bind函数把地址绑定到套接口。

使用PF_INET和SOCK_STREAM

      目前,在domain参数为PF_INET的SOCK_STREAN的套接口中,protocol的参数为0意味着内核选择IPPROTO_TCP,也就是套接口使用TCP/IP协议。

使用PF_INET和SOCK_DGRAM

     这个组合告诉内核选择UDP协议。也就是选择IPPROTO_UDP。

下表是一个总结:

当然Linux支持许多的协议,此处不多说。

有关协议族的一些宏定义在sys/socket.h头文件中,而实际上这个文件包含了另外一个定义协议宏常量的头文件,它的路径名是:

/usr/include/bits/sockett.h

我们可以使用grep命令将内核中可能支持的协议打印出:grep PF_ /usr/include/bits/socket.h

Linux Socket学习--套接口的类型和协议相关推荐

  1. Linux Socket学习--为套接口绑定地址

    当我们使用socket函数创建一个套接口之后,这个套接口就处于无名状态,虽然之前我们提到即使没有地址,套接口也能使用,但是这个只限于套接口对在同一个Linux内核中,如果位于两台不同的主机的套接口需要 ...

  2. Linux Socket学习(十二)

    套接口选项 在前面的几章中,我们讨论了使用套接口的基础内容.现在我们要来探讨一些可用的其他的特征.在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备.在这一章,我们将会专注于下列主 ...

  3. Linux Socket学习(十三)

    使用UDP进行广播 如果通信只能在两个单体之间完成,这样的方式是没有效率的.另一方面,广播允许同时要多个接收者传播信息. 在这一章,我们将会学习下列内容: 建立一个UDP广播套接口 使用套接口发送广播 ...

  4. Linux Socket学习(五)

    地址转换函数 上一章中,我们已经了可以分配与初始化各种类型的套接口.这些是由一个常量进行初始化的简单例子.由一个使用变化地址的C字符串设置一个地址需要更多的编程努力.在这一章,我们将会关注建立网络地址 ...

  5. Linux - Socket网络套接字

    OSI七层协议功能 物理层 面向物理传输媒体,屏蔽媒体的不同 主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进 ...

  6. Linux Socket学习(十八)--完

    一个实际的网络工程 不论我们的头脑是否在由上一章的学习中清醒过来,现在我们需要休息一下了.在这一章我们并不讨论新的内容,而是用我们所学到的这些东西来实现一些有趣的事情.在学习了这么多的东西之后来一些有 ...

  7. Linux驱动学习--USB接口wifi/BT芯片开发之BT开发(BlueDroid框架)

    目录 一.引言 二.整体框架分析(结合实际芯片分析) 三.内核中的相关配置 四.厂家驱动分析 五.蓝牙BlueDroid协议 一.引言 之前我们简单分析过BlueDroid框架,今天来结合源码,挑重点 ...

  8. Linux Socket学习--面向非连接的协议

    套接口的通信有2中基本方式:面向连接和面向非连接的通信. 面向非连接指的是通信之前不需要建立连接,我们生成了一个非连接的套接口,就可以向任何愿意接受我们消息的套接口发送消息,而且每一个消息都可以被重定 ...

  9. Linux socket学习

    1 //服务器端 server.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 ...

最新文章

  1. 基于运动信息的物体检测(背景差分法、帧间差分法和光流法)。
  2. 360起诉山东卫视或有利于杜绝有偿新闻
  3. POJ 3030 Nasty Hacks (模拟题)
  4. Perfect service(树形dp)
  5. [转]sqlplus中不能上下键选择前一条命令解决方法
  6. luogu P2679——子串
  7. 《研磨设计模式》chap22 装饰模式Decorator(3)I/O流
  8. 时间轴ui设计_我应该在UI设计上花更多时间吗?
  9. 认识计算机系统反思,《计算机系统组成》教学反思
  10. Linux Shell脚本专栏_批量主机远程执行命令脚本_08
  11. java.util (Collection接口和Map接口)
  12. c语言通讯录程序线性表,数据结构(C语言)课设1——单位员工通讯录管理系统(线性表应用)...
  13. u盘循环冗余能修复吗_激素脸怎么办?激素脸还能改善修复好吗?
  14. 表格中点击获得行列的值、刷新页面
  15. 剑指Offer_07_斐波那契数列
  16. 语音识别属于计算机的什么应用领域,语音识别系统
  17. 我的飞信发展方案(一)
  18. 【机器学习实战系列】读书笔记之AdaBoost算法公式推导和例子讲解(一)
  19. 2020.04 总结分享
  20. Ubuntu 20.04安装绿联PL2303串口驱动

热门文章

  1. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (4)
  2. Unity中BVH骨骼动画驱动的可视化理论与实现
  3. tensorflow2安装时候的一个dll找不到的错误
  4. Core Foundation 与 cocoa Foundation框架区别
  5. MySQL查询count(*)、count(1)、count(field)的区别收集
  6. 在Winform中菜单动态添加“最近使用文件”
  7. weui-switch开关控件,表单提交后如何取值
  8. LaTeX基础一:安装与基本操作
  9. 在未启动程序情况 点击视图设计器 弹出未将对象引用窗体的解决方案
  10. 本地搭建Dubbo监控中心的安装步骤