Linux Socket学习--套接口的类型和协议

简介:

  我们首先来说一下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。

下表是一个总结:

image

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

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

/usr/include/bits/sockett.h

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

目录
打赏
0
0
0
0
20
分享
相关文章
7个设置/获取接口了解Linux时间管理
本文系统介绍了Linux时间管理中的7个关键设置/获取接口,涵盖时间获取(如`time`、`gettimeofday`、`clock_gettime`)、时间设置(如`stime`、`settimeofday`、`clock_settime`)以及时间转换和格式化等内容。文章详细解析了绝对时间和相对时间的概念,包括GMT、UTC及本地时间的区别,并通过实例测试展示了各接口的使用方法与特性。此外,还探讨了时区设置对时间计算的影响,强调在实际开发中推荐使用UTC作为基准时间以避免时区变化带来的问题。总结部分结合项目经验,提醒开发者注意时间服务的重要性及潜在风险,例如时间跳跃可能引发的应用故障。
66 14
7个设置/获取接口了解Linux时间管理
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
本文详细介绍了在VMware虚拟机中安装CentOS 6.8的全过程。首先,需确保已安装VMware并开启V-CPU虚拟化功能,可通过BIOS设置或使用LeoMoon CPU-V工具检测。接着,下载CentOS镜像文件,并在VMware中新建虚拟机,配置CPU、内存、硬盘等参数。最后,加载ISO镜像启动虚拟机,按照提示完成CentOS的安装,包括语言、键盘、存储方式、地区、密码设置及硬盘分区等步骤。安装完成后,以root用户登录即可进入系统桌面,开始学习Linux命令和操作。
159 12
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
335 2
用Apifox调试Socket.IO接口,从原理到实践
传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时通信框架的价值所在。
用Apifox调试Socket.IO接口,从原理到实践
如何调试 Socket.IO 接口?图文教程
Socket.IO 是一个用于实现低延迟、双向和基于事件通信的库,广泛应用于实时应用开发中。有效测试 Socket.IO 接口对于确保应用稳定性和功能正确性至关重要。本文介绍如何使用 Apifox 轻松进行 Socket.IO 接口测试,包括新建接口、监听事件、发送消息、配置握手参数、使用变量、保存和共享接口等步骤。Apifox 操作简便、功能完善,是开发者调试 Socket.IO 接口的得力助手,帮助确保实时通信的可靠性和稳定性,提高开发效率。
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
101 2