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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8266串口调试助手_200行Python代码实现串口调试助手(2) 界面构建

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是串口调试工具pzh-py-com诞生之界面构建。一个软件的UI界面是非常重要的&#xff0c;这是软件与用户交互的接口&#xff0c;软件功能即使再强大&#xff0c;但如果没有清晰的UI界面&#…

权限访问控制设计

一、前言 之前的博客一直都还没写到框架的实现及权限系统&#xff0c;今天开始写我的权限系统&#xff0c;我以前做过的项目基本上都有权限管理这个模块&#xff0c;但各个系统都会有一些不太一样&#xff0c;有些简单点&#xff0c;有些稍微复杂一点&#xff0c;一句话&#x…

关于页面布局的一些注意点

1、在div布局不好解决的地方不用犹豫&#xff0c;使用table&#xff01; 2、div使用百分比大小时如果其又受其他元素的固定高宽影响的话overflow无效&#xff0c;加入position:absolute即可解决 3、当有dtd头存在时height的百分比单位不起…

jquery $.trim()方法使用介绍

$.trim(str)的作用是去掉字符串首尾空格 $.trim(str) 返回&#xff1a;string&#xff1b; 说明&#xff1a;去掉字符串首尾空格。 示例&#xff1a; 先看个错误代码&#xff1a; <input type"text" name"" id"results" value""/&…

卸载失败_Windows 10可能的新功能-自动卸载失败的补丁更新

Windows 10作为Windows最新报告&#xff0c;微软正在向Windows 10添加一项新的恢复功能&#xff0c;该功能旨在自动检测更新安装后启动失败的时间。在用户不必做任何事情的情况下&#xff0c;将卸载违规更新&#xff0c;这个操作可以引导系统再次运行。根据在线发布的支持文档&…

用java发送邮件(黄海已测试通过)

/*** java发送带附件的邮件* 周枫* 2013.8.10*/ package com.dsideal.Util; import javax.mail.*; import javax.mail.internet.*;import java.util.*; import javax.activation.*;public class SendMail {private static String host "smtp.qq.com"; // smtp服务器…

MS SQL 不常用但却十分有用的一些语法

创建自定义数据类型 CREATE TYPE ADDRESS FROM VARCHAR(30) NOT NULL数据量大了的情况下修改表某字段类型方法 ALTER TABLE TEST ALTER COLUMN TEST VARCHAR(80) 注意&#xff1a;如果要包含一些数据如numeric数据类型转换成为Integer数据类型时数据将自动取整&#xff0c;所以…

iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一、CAEmitterLayer CAEmitterLayer是CoreAnimation框架中的粒子发射层&#xff0c;在以前的一片博客中有详细的介绍和范例&#xff0c;这里不再重复&#xff0c;地址如下&#xff1a; 粒子效果的应用和火焰范例&…

中文格式_常见中文编码格式

中文编码主要有以下四种&#xff1a;GB2312简体中文编码&#xff0c;一个汉字占用2个字节&#xff0c;在大陆是主要的编码方式。当文章/网页中包含繁体中文、日文、韩文等时&#xff0c;这些内容可能无法被正确编码。BIG5繁体中文编码&#xff0c;主要在台湾地区使用。GBK支持简…

广播发送与接收

//发送端 #include <iostream> #include <stdio.h> #include <string.h> #include <winsock2.h> using namespace std; int main() { WSADATA wsaData; short version MAKEWORD(2,0); WSAStartup(version,&wsa…

征服英语的30个坏习惯

作者&#xff1a;李阳 亲爱的正在征服英语的战友们&#xff0c;你们辛苦了&#xff01; 我总结了20多年来我自己以及我周围的成功人士们风风雨雨的生活和奋斗历程&#xff0c;得出了如下结论&#xff1a; 英语的好习惯决定英语学习的最终成败&#xff01; 这些好习惯包括&…

SQLite数据库常用语句及MAC上的SQLite可视化工具MeasSQLlite使用

SQLite数据库常用语句及MAC上的SQLite可视化工具MeasSQLlite使用 一、引言 在移动开发中&#xff0c;通常会用到一些小型的数据库进行数据管理。SQLite是一款十分小巧便捷的数据库&#xff0c;在iOS开发中&#xff0c;原生框架也对其有很好的支持。 二、SQLite常用语句 数据库…

SQL Server之字符串函数

以下所有例子均Studnet表为例&#xff1a; 计算字符串长度len&#xff08;&#xff09;用来计算字符串的长度 select sname ,len(sname) from student字符串转换为大、小写lower() 用来将一个字符串转换为小写&#xff0c;upper() 用来将一个字符串转换为大写 select lower(I …

vue重复路由_vue后台管理系统,动态添加路由,路由重复

使用vue-router的addRoutes动态添加路由时&#xff0c;子路由重复了。点击‘职工类型’&#xff0c;路由地址变为‘http://localhost:8123/#/workerType’&#xff0c;显示的却是‘职工列表’点击‘职工列表’&#xff0c;路由地址变为‘http://localhost:8123/#/workerList’&…

Makefile文件编写

Makefile的一般格式如下&#xff1a; target&#xff1a; components TAB rule 第一行表示的是依赖关系.第二行是规则. 一个通用的Makefile例子&#xff0c;本人觉得还可以&#xff0c;所以就推荐一下 ob file1 #ob为一变量&#xff0c;以后如果要改变源程序…

tonardo做web服务器播放大视频内存泄露问题的解决

之前为了实现websocket来完成网页的推送&#xff0c;所以使用了tonardo作为web服务器。但是如果网页中含有视频插件的话&#xff0c;特别是经常要播放大视频的话&#xff0c;在linux环境下&#xff0c;经常发现 python进程会莫名其妙的死掉。通过内存检测命令动态查看&#xff…

yii框架源码分析之创建controller

使用yii框架的url路径一般形如hostname/?rxxxx/xxxx/xxxx&sdfsdsfdsf我们可以看到有时会使用protected目录下的controller&#xff0c;有时会使用module中controller&#xff0c;具体是如何处理的呢&#xff0c;请看如下的分析&#xff1a;以下代码摘自yii框架核心代码%Yi…

Android通用流行框架大全

Android通用流行框架大全 1. 缓存 名称描述DiskLruCacheJava实现基于LRU的磁盘缓存2.图片加载 名称描述Android Universal Image Loader一个强大的加载&#xff0c;缓存&#xff0c;展示图片的库Picasso一个强大的图片下载与缓存的库Fresco一个用于管理图像和他们使用的内存的库…

Windows Shell 编程 第六章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987951】...

第六章 快捷方式的最短路径 Windows Shell允许存储任何对象的引用到系统范围内的任何地点。例如&#xff0c;当你从一个文件夹拖拽可执行程序到另一个文件夹时&#xff0c;鼠标自动改变形状给出除拷贝和移动文件之外的第三种选择。 除非你确定&#xff0c;否则可执行文件是不能…

python素材和代码_python之文件和素材

11.1 打开文件open函数open(name[,mode[,buffering]])>>>f open(rC:\text\somefile.txt)11.1.1 文件模式open函数中模式参数的常用值r读模式w写模式a追加模式b二进制模式读/写模式通过在模式参数中使用U参数能够在打开文件时使用通用的换行符支持模式&#xff0c;在这…