【计算机网络】网络编程接口 Socket API 解读(11)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。
本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。
shutdown(2)
遵循 POSIX.1-2008
1.库
标准 c 库,libc, -lc
2.头文件
<sys/socket.h>
3.接口定义
int shutdown(int sockfd, int how);
4.接口描述
shutdown() 调用会将 sockfd 指定的套接字上全双工连接上的一端或者两端关闭。如果 how 指定为 SHUT_RD,那么套接字上将不允许接收;如果 how 指定为 SHUT_WR,那么套接字上将不允许发送。如果 how 是 SHUT_RDWR,那么发送和接收都不允许。
5.返回值
成功时返回 0,失败返回 -1 并设置 errno。
6.注意
SHUT_RD、SHUT_WR、SHUT_RDWR 的值分别为 0、1、2,在 glibc-2.1.91 <sys/socket.h> 中定义。
how 的合法性检查会在相关的域代码中进行,但是 Linux 3.7 前并不是所有的域都会进行可用性检查。Linux 域套接字直接会忽略不可用的值,Linux 3.7 后这个问题修复了。
close(2)
遵顼 POSIX.1-2008
1.库
标准 c 库,libc, -lc
2.头文件
<unistd.h>
3.接口定义
int close(int fd);
4.接口描述
close() 会关闭一个文件描述符,关闭的描述符不再指向任何文件,关闭后可以重新使用该文件描述符。文件上和文件描述符相关的由该进程所有的记录锁(参考 fcntl(2))将会被移除(不管是用哪个文件描述符获得的该锁)。
如果 fd 是最后一个指向底层打开的文件描述的描述符(参考 open(2)),打开文件描述的相关资源都会被释放;如果文件描述符是最后一个指向通过 unlink(2) 移除的文件,那么文件会被删除。
5.返回值
成功时返回 0,失败返回 -1 并设置 errno。
错误列表如下:
EBADF fd 不是一个可用的文件描述符
EINTR close() 被中断打断;参考 signal(7)
EIO I/O 错误发生
ENOSPE、EDQUOT
在 NFS 上,第一次超出可用空间的写不会报告这些错误,而是在接下来的 write(2)、fsync(2) 或者 close(2) 时报告这些错误。可以参考注意部分查看为什么 close() 在报错后不能再次重试。
6.注意
成功关闭文件描述符并不保证数据成功同步到磁盘上,因为内核会使用缓冲区来做延迟写。通常情况下,文件系统不会在文件关闭时同步这些缓冲区到磁盘上。如果我们想确信数据被存储到底层磁盘,使用 fsync(2) 先进行同步。(从这一点上,也依赖磁盘硬件)。
如果文件描述符标记指定了 close-on-exec,那么就可以保证文件在执行 execve(2) 时自动关闭。参考 fcntl(2) 查看详细信息。
多线程进程和 close()
一个进程中如果有其他线程在使用系统调用访问文件描述符,那么通过 close 关闭文件描述符是非常不明智的。因为文件描述符可以重用,一些条件竞争就可能会导致一些意想不到的结果。
此外,我们可以考虑下面两个线程操作同一个文件描述符的场景:
(1)一个线程正在阻塞在文件描述符的系统调用上,比如向一个满了的管道尝试 write(2) 写,或者从一个没有数据的流套接字上 read(2) 读。
(2)另一个线程关闭这个文件描述符
这种情况在不同的系统上的行为是不一样的,一些系统上一旦文件描述符关闭,其他阻塞系统调用就会返回错误。
在 Linux 以及另一个系统上,行为是不同的:阻塞的 I/O 系统调用一直持有底层打开的文件描述,直到 I/O 系统调用结束。(参考 open(2) 关于打开文件描述的讨论。)因此,阻塞系统调用完全可能在 close() 后仍然成功返回。
close() 返回错误处理
编程人员需要检查 close() 的返回值,因为很可能之前 write(2) 的错误只能在最后的 close() 要释放文件描述时才会报告。不检查错误返回值可能会导致一些数据偷偷的丢掉,这种情况在 NFS 和磁盘配额时是常见的。
然而这些错误返回值只能用来诊断(即向应用发出警告:可能仍然有一些等待的 I/O 或者 I/O 失败)以及重播目的(即再写一次文件或者创建备份)。
失败后重试 close() 是不可行的,因为文件描述符可能会被其他线程重用,导致误关闭其他线程文件描述符,这主要是因为内核会首先释放文件描述符,然后再进行一些会返回错误的操作,比如将数据刷新到文件系统或设备。
一些其他系统实现也会再报告错误的情况下关闭文件描述符(除了 EBADF,表示文件描述符不可用)。POSIX.1 目前对这点并没有提出什么,不过可能在下一个主版本会授权这种做法。
我们可以通过在发生错误的 close(2) 后调用 fsysnc(2) 来了解具体是发生了什么 I/O 错误。
EINTR 错误有点特殊,关于这个错误,POSIX.1-2008 的说法是:
如果 close() 被能被捕捉到的信号中断,它应该返回 -1 并将 errno 设置为 EINTR,fildes 状态未指定
这就允许 Linux 以及其他实现上可以像处理其他错误一样处理这个错误,文件描述符保证被关闭了。然而,也允许返回 EINTR 后仍然保持文件描述符是打开的。(HP-UX 的 close() 就是这样的。)调用者必须重新使用 close() 来关闭文件描述符,避免文件描述符泄露。这种实现的不同导致了程序移植性问题,因为其他实现在失败后不允许重新 close()。下一个 POSIX.1 的主版本也会解决这个问题。
相关文章:
【计算机网络】网络编程接口 Socket API 解读(11)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。…...
Qt工具开发,该不该跳槽?
Qt工具开发,该不该跳槽? 就这样吧,我怕你跳不动。 嵌入式UI,目前趋势是向着LVGL发展。QT已经在淘汰期了。很多项目还在用,但技术上已经落后。QT短期内不会全面淘汰,但退位让贤的大趋势已经很清楚了。 最近很多小伙伴…...
【深度学习】DDPM,Diffusion,概率扩散去噪生成模型,原理解读
看过来看过去,唯有此up主,非常牛: Video Explaination(Chinese) 1. DDPM Introduction q q q - 一个固定(或预定义)的正向扩散过程,逐渐向图像添加高斯噪声,直到最终得到纯噪声。 p θ p_θ p…...
HT8699:内置 BOOST 升Y双声道音频功率放大器
HT8699是一款内置BOOST升Y模块的立体声音频功率放大器。HT8699具有AB类和D类切换功能,在受到D类功放EMI干扰困扰时,可切换至AB类音频功放模式。 在D类模式下,内置的BOOST升Y模块可通过外置电阻调节升Y值,即使是锂电池供电…...
利达卓越:关注环保事业,持续赋能科技
随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…...
Spring MVC中通过配置文件配置定时任务
Spring MVC中配置定时任务(配置文件方式) 1.步骤 1.步骤 1-1 在springmvc.xml(配置文件)的beans中添加 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http…...
AI项目十六:YOLOP 训练+测试+模型评估
若该文为原创文章,转载请注明原文出处。 通过正点原子的ATK-3568了解到了YOLOP,这里记录下训练及测试及在onnxruntime部署的过程。 步骤:训练->测试->转成onnx->onnxruntime部署测试 一、前言 YOLOP是华中科技大学研究团队在2021年…...
Flink报错could not be loaded due to a linkage failure
文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业,点Submit没反应,F12看到接口报错信息为: 大概意思是,由于链接失败,无法加载程序的入口点类xx。没啥鸟用的信息,去日志目录继续分析:…...
网络工程师--网络安全与应用案例分析
前言 需要网络安全学习资料的点击链接:【282G】网络安全&黑客技术零基础到进阶全套学习大礼包,免费分享! 案例一: 某单位现有网络拓扑结构如下图所示,实现用户上网功能,该网络使用的网络交换机均为三…...
了解油封对汽车安全的影响?
油封也称为轴封或径向轴封,是车辆发动机、变速箱和其他各种机械系统中的重要部件。它们的主要功能是阻止重要发动机部件的液体(例如油或冷却剂)泄漏,同时防止污染物进入。这些看似简单的任务,但对汽车的安全性和可靠性有着深远的影响。 油封…...
创邻科技Galaxybase—激活数据要素的核心引擎
10月11日下午,创邻科技创始人张晨博士受杭州电子科技大学邀请,前往杭电校园开展交流分享。交流会中,张晨博士为现场的师生带来一场题为《图数据库——激活数据要素的新基建》的精彩分享,探讨数字经济时代底层技术的创新价值与图技…...
【Rust笔记】浅聊 Rust 程序内存布局
浅聊Rust程序内存布局 内存布局看似是底层和距离应用程序开发比较遥远的概念集合,但其对前端应用的功能实现颇具现实意义。从WASM业务模块至Nodejs N-API插件,无处不涉及到FFI跨语言互操作。甚至,做个文本数据的字符集转换也得FFI调用操作系统…...
玻璃生产过程中的窑内压力高精度恒定控制解决方案
摘要:在玻璃生产中对玻璃窑炉中窑压的要求极高,通常需要控制微正压4.7Pa(表压),偏差控制在0.3Pa,而窑炉压力还会受到众多因素的影响,所以实现高稳定性的熔窑压力控制具有很大难度,为…...
创意营销:初期推广的多种策略!
文章目录 🍊 预热🎉 制定预热计划和目标🎉 利用社交媒体传播🎉 创造独特的体验🎉 利用口碑营销🎉 定期发布更新信息🎉 案例说明 🍊 小范围推广🎉 明确目标用户群体&#…...
【小黑嵌入式系统第一课】嵌入式系统的概述(一)
文章目录 一、嵌入式系统基本概念计算机发展的三大阶段CPU——计算机的核心什么是嵌入式系统嵌入式系统的分类 二、嵌入式系统的特点三、嵌入式系统发展无操作系统阶段简单操作系统阶段实时操作系统阶段面向Internet阶段 四、嵌入式系统的应用工业控制 工业设备通信设备信息家电…...
RK平台使用MP4视频做开机动画以及卡顿问题
rk平台android11以后系统都可以使用MP4格式的视频做开机动画,系统源码里面默认使用的是ts格式的视频,其实使用mp4的视频也是可以的。具体修改如下: diff --git a/frameworks/base/cmds/bootanimation/BootAnimation.cpp b/frameworks/base/cmds/bootanimation/BootAnimat…...
通讯网关软件023——利用CommGate X2HTTP实现HTTP访问Modbus TCP
本文介绍利用CommGate X2HTTP实现HTTP访问Modbus TCP。CommGate X2HTTP是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,SCADA系统上位机、PLC、设备具备Modbus RTU通讯接口,现在…...
Python性能测试框架Locust实战教程!
01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户,Locust 在英文中是 蝗虫 的意思:作者的想法是在测试期间,放…...
c++视觉处理---仿射变换和二维旋转变换矩阵的函数
仿射变换cv::warpAffine cv::warpAffine 是OpenCV中用于执行仿射变换的函数。仿射变换是一种线性变换,可用于执行平移、旋转、缩放和剪切等操作。下面是 cv::warpAffine 函数的基本用法: cv::warpAffine(src, dst, M, dsize, flags, borderMode, borde…...
uiautomator2遍历子元素.all()
当你获取了页面某个元素之后 elements d(’//*[clickable“true”]’).all() 返回的是一个list,其中是<uiautomator2.xpath.XMLElement>类型的变量。 可以通过以下方式获取它所有子类的信息。 for ele in elements:children ele.elem.getchildren()注意…...
Simple Runtime Window Editor:突破游戏窗口限制的终极解决方案
Simple Runtime Window Editor:突破游戏窗口限制的终极解决方案 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾为游戏内置分辨率选项太少而烦恼?是否想在窗口模式下获得全屏游戏…...
别再乱装CUDA了!用Anaconda为你的3060 Ti一键搞定PyTorch GPU环境(含CUDA 11.3实战)
3060 Ti显卡玩家的PyTorch环境配置指南:用Anaconda避开CUDA版本地狱 在深度学习领域,GPU加速已经成为提升模型训练效率的标配。然而,对于许多刚入门的开发者来说,配置PyTorch的GPU支持往往成为第一道门槛——尤其是当涉及到CUDA版…...
5分钟快速掌握Windows右键菜单终极管理神器ContextMenuManager
5分钟快速掌握Windows右键菜单终极管理神器ContextMenuManager 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是不是经常在右键文件时,面对几十个…...
Wand-Enhancer:免费解锁WeMod专业版功能的终极本地增强工具
Wand-Enhancer:免费解锁WeMod专业版功能的终极本地增强工具 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的高昂订阅费用…...
终极指南:3步实现PotPlayer实时字幕翻译,外语视频无障碍观看
终极指南:3步实现PotPlayer实时字幕翻译,外语视频无障碍观看 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还…...
Midjourney湿版摄影风格实战手册(从胶片化学原理到Prompt工程):含12组经大英博物馆湿版藏品验证的Reference Prompt库
更多请点击: https://intelliparadigm.com 第一章:湿版摄影的历史溯源与Midjourney风格化转译本质 湿版摄影(Wet Plate Collodion Process)诞生于1851年,由弗雷德里克斯科特阿彻(Frederick Scott Archer&a…...
AI编程助手CodeBuddy:VS Code扩展的架构、部署与高效使用指南
1. 项目概述:CodeBuddy,你的AI编程伙伴最近在GitHub上看到一个挺有意思的项目,叫codebuddy,作者是olasunkanmi-SE。光看名字就能猜个大概——“代码伙伴”,这显然是一个旨在辅助编程的工具。作为一个在开发一线摸爬滚打…...
数据流编排与异步任务调度中间件kelivo部署与实战指南
1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫“Chevey339/kelivo”。乍一看这个标题,可能有点摸不着头脑,它不像那些直接告诉你“XX管理系统”或“XX工具库”的项目名那么直白。但恰恰是这种看似神秘的命名,背后往往隐藏…...
AI增强型写作工具Hermes-Writer:为开发者打造的智能写作助手
1. 项目概述:一个面向开发者的智能写作助手最近在GitHub上看到一个挺有意思的项目,叫dav-niu474/Hermes-Writer。乍一看标题,你可能会觉得这又是一个普通的Markdown编辑器或者写作工具。但如果你点进去,仔细研究一下它的README、代…...
Cursor编辑器性能优化:精准重置缓存与进程的开发者效率工具
1. 项目概述:一个被低估的开发者效率工具如果你是一名开发者,尤其是深度使用 Cursor 这类 AI 驱动的代码编辑器,那么你一定遇到过这样的场景:编辑器突然变得卡顿、代码补全失灵、AI 建议变得驴唇不对马嘴,或者插件行为…...
