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

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

相关文章

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API框架, 由于使用了 httprouter,速度提高了近40倍。 第一个Gin示例 package mai

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指

初识Linux · 进度条

目录 前言: 1 缓冲区和回车换行 2 进度条 前言: 我们目前学习了些许知识,已经足够支持我们写一个非常非常小的项目了,即进度条,相信大家都有过下载游戏,等待游戏更新完成的时候,那么此时就有一个进度条,代表着游戏的更新进度,那么我们今天就来模拟实现这个过程,在此之前,我们需要一些预备知识。 1 缓冲区和回车换行 回车换行?是的,你没有看错,相信不少人对换行有一定的误解,我们

Linux初识线程

前言 前面在介绍进程的时候,说过进程的内核表述是"进程是承担资源分配的基本实体",但是我们至今都没有介绍如何理解他?本期我们就会介绍! 目录 前言 一、再谈地址空间和页表 1、OS对物理内存的管理 • 为什么4KB是OS进行I/O的基本单位? 2、再谈页表 • 二级页表 • 如何找到一个变量的所有字节? • 虚拟地址是如何转为物理地址的? • 理解动态内存管理 • 为什么对

微软C#套接字异步通信代码

Asynchronous Server Socket Example.NET Framework 4 其他版本 The following example program creates a server that receives connection requests from clients. The server is built with an asynchronous socket,

套接字的介绍

套接字(Socket)是计算机网络中用于实现不同主机之间通信的一种抽象概念。它提供了一种标准的接口,使得应用程序能够通过网络发送和接收数据。以下是关于套接字的详细介绍: 1. 套接字的基本概念 定义:套接字是一种用于网络通信的端点,通常由 IP 地址和端口号组成。它允许不同的程序进行网络通信。类型: 流套接字(TCP Socket):使用传输控制协议(TCP),提供可靠的、面向连接的通信。数据

初识命名空间

1.创建两个命名空间 ip netns add host1 ip netns add host2 2.  查看命名空间 ip netns ls 3 、 创建veth ip -netns host1 link add veth0 type veth peer name host1-peer 4、 查看命名空间接口  ip -netns host1 address 5、 把hos

Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

目录 1、冯诺伊曼体系结构 问题一:为什么在体系结构中存在存储器(内存)? 存储单元总结: 问题二:为什么程序在运行的时候,必须把程序先加载到内存? 问题三:请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 2、操作系统 2.1操作系统的概念: 我们首先要明白什么是管理: 2.2为什么要有操作系统? 2.3操作系统如何保证稳定和安全呢?(利用系统调用函数解决)