第十六章(二) 套接字初识

2024-06-22 20:08
文章标签 接字 初识 第十六章

本文主要是介绍第十六章(二) 套接字初识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



数据传输:
 尽管可以通过 read 和 write 交换数据,但这就是这两个函数所能作的一切。但是如果想要指定选项,从多个客户端接收数据包,或者发送带外数据,就需要使用6个为数据传递而设计的套接字函数。 

三个传送数据的套接字函数:

<span style="color:#000000;">ssize_t send(int sockfd, void *buf, size_t nbytes, int flags)/*使用send时套接字必须已经连接与write不同的是,send支持第4个参数 flagsflags标识符的取值如下: 1、MSG_DONTROUTE   勿将数据路由出本地网络 2、MSG_DONTWAIT    允许非阻塞操作 3、MSG_EOR         如果协议支持,此为记录结束 4、MSG_OOB         如果协议支持,发送带外数据 即使send成功返回,也无法确定另一端一定接收到了数据,只能保证数据已经无错误的发送到网络驱动程序上。对于支持为报文设限的协议,若报文超过协议所支持的最大尺寸,send失败并将errno设为EMSGSIZE;  对于字节流协议,send会阻塞直到整个数据被传输; */</span>


ssize_t sendto(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *destaddr, socklen_t destlen);//与send类似,但是区别在于此函数可以在无连接的套接字上指定一个目标地址//该函数通过指定目标地址允许在无连接的套接字之间发送数据,无连接的套接字之间通信不能使用send函数,除非connect时预先设定目标地址;

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);    //可以指定多重缓冲区传输数据

三个接收数据的套接字函数:

ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);   //该函数的功能类似与read函数,除了有标识符flags之外,其他的相同; /*flags标识符的取值如下: 1、MSG_PEEK        返回报文内容而不真正取走报文 2、MSG_TRUNC       即使报文被截断,要求返回的是报文的实际长度 3、MSG_WAITALL     等待直到所有数据可用 4、MSG_OOB         如果协议支持,发送带外数据 */


  
  
ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *addr, socklen_t *addrlen);  //若addr非空,它将包含数据发送者的套接字端点地址,该函数常用于无连接套接字; 


ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);  //将接受到的数据送入多个缓冲区



套接字选项
 套接字机制提供了两个套接字选项接口来控制套接字行为。可以获取或设置以下3种选项:
  1、通用选项,工作在所有套接字类型上
  2、在套接字层次管理的选项,但是依赖于下层协议的支持
  3、特定于某协议的选项,每个协议独有

int setsockopt(int sockfd, int level, int option, void *val, socklen_t len)/*函数用来设置套接字选项参数level标识了选项用的协议参数 val 根据level的不同指向一个数据结构或者一个整数。一些选项是 on/off 开关。若整数非0,则启用选项;为0即禁止参数len指定val对象大小*/

int getsockopt(int sockfd, int level, int option, void *val, socklen_t *lenp)//用于查看选项的当前值//调用函数前,设置该整数为复制选项缓冲区的长度,若实际大于此值,则选项被截断;若小于,则更新为实际值



带外数据
 带外数据是一些通信协议所支持的可选功能,与普通数据相比,其具有更高优先级的数据传输。带外数据先行传输,即使传输队列已经有数据,
 TCP支持带外传输,UDP不支持

 TCP将带外数据称为紧急数据,但仅支持一个字节的紧急数据

 如果通过套接字安排了信号的产生,那么紧急数据被接收时,会发送SIGURG信号
  fcntl( sockfd, F_SETOWN, pid)
   (pid为负表示为进程组,为正表示某个进程)
 当然能用F_GETOWN来获取套接字所有权的进程
  own = fcntl(sockfd, F_GETOWN, 0)

 TCP支持紧急标记的概念。 若采用SO_OOBINLINE,那么可以在普通数据中接收紧急数据。
 函数 int sockatmark(int sockfd)
  用于判断是否已经到达了紧急数据
  当下一个要读取的字节在紧急标识处时,返回1


这篇关于第十六章(二) 套接字初识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085286

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

C语言入门系列:初识函数

文章目录 一,C语言函数与数学函数的区别1,回忆杀-初中数学2,C语言中的函数 二, 函数的声明1,函数头1.1,函数名称1.2,返回值类型1.3,参数列表 2,函数体2.1,函数体2.2,return语句 三,main函数四,函数的参数与传递方式1,实参和形参1.1,函数定义(含形参)1.2,函数调用(使用实参) 2,参数传递方式2.1,值传递2.2,引用传递 五,函数原型与预声明1,

任务5.1 初识Spark Streaming

实战概述:使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架,用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统,能够处理流式数据并统计文本中的单词出现频率。 2. 技术要点 Spark Streaming集成: 与Spark生态的其他组件如Spark SQL、ML

初识 SpringMVC,运行配置第一个Spring MVC 程序

1. 初识 SpringMVC,运行配置第一个Spring MVC 程序 文章目录 1. 初识 SpringMVC,运行配置第一个Spring MVC 程序1.1 什么是 MVC 2. Spring MVC 概述2.1 Spring MVC 的作用: 3. 运行配置第一个 Spring MVC 程序3.1 第一步:创建Maven模块3.2 第二步:添加 web 支持3.3 第三步:配置 w

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法

在连接数据库的时候出现了下面图面中的错误,尝试集中方法后终于解决了这个问题。 1.修改驱动程序版本 出现这种错误可能是因为你的驱动程序版本不兼容,我们可以尝试修改版本解决。而我们的驱动程序往往是以依赖的形式导入,因此可以在maven仓库查找你的数据库对应的驱动程序,选择一个数据库能够兼容的版本导入。 maven仓库官网:https://mvnrepository.com/ 2.在 VM opt

测试辅助工具(抓包工具)的使用1 之初识抓包工具(fiddler)

1.什么是抓包? 说明:客户端向服务器发送请求以及服务器响应客户端的请求,都是以数据包来传递的。 抓包(packet capture):通过工具拦截客户端与服务器交互的数据包。 抓包后可以修改数据包的内容  2.为什么要抓包? 确定bug是前端研发人员的还是后端研发人员的 3.如何抓包? 1)使用抓包工具Fiddler 2)Fiddler介绍: Fiddl

第十六章 非阻塞I/O

第十六章、非阻塞式I/O 什么是阻塞socket和非阻塞socket?两者的具体区别是什么?     读操作         对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返回。当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数。当sockt的接收缓冲区中的数据大于期望读取的字节数时,读取期望读取的

UDP编程初识

复习: TCP     每个TCP套接字都有一个发送区,我们可以使用SO_SNDBUF来更改缓冲区的大小,当进程调用write时,内核从该应用进程的缓冲区中复制所有数据到套接字的缓冲区。如果该套接字的发送缓冲区容不下该应用进程的所有数据(或是应用进程的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区已有其他数据),该应用进程将被投入睡眠(这里的套接字是阻塞的),内核将不从write系统

第十六章(一) 套接字初识

 地址格式  一个地址标识一个特定通信域的套接字端点,地址格式与这个特定的通信域相关。为使不同的格式地址能够传入到套接字函数,地址会被强制转化成一个通用的地址结构: struct sockaddr{sa_family_t sa_family; //address familychar sa_data[]; //variable-length address...};

Libevent源码分析之event结构体初识

I/O框架库以库函数的形式,封装了较为底层的系统调用,给应用程序提供了一组更为便捷的接口 各种I/O框架库的实现原理基本相似,要么以Reactor模式实现,要么以Proactor模式实现,要么同时用这两种模式。 拿基于Reactor模式的I/O框架库来说,包含以下几个组件: 1、句柄     I/O框架库要处理的对象,即I/O事件、信号和定时事件,统一称为事件源。一个事件源通常和