最新要闻
- 收紧、限劣、“网开一面”!IPO、再融资新规超预期
- 比特币“失宠”?交易量跌至2018年来最低水平
- 黄奕电影上映时间(黄奕新电影龙棺古墓
- 公司会计网络赌博一掷千金 侵占公司款项2780余万元获刑
- 成都温江区鲁家滩潮流运动消费场景入选2023年度四川省“蜀里安逸”消费新场
- 上班时发病请假回家而死亡有赔偿吗
- 常州市住建局:推进建筑领域光伏应用,助力“新能源之都”建设
- 10.79亿网民如何共享美好数字生活?——透视第52次《中国互联网络发展状况统计报告》
- 1分钟卖5辆、1辆赚3.4万!比亚迪毛利超特斯拉:上半年赚翻了
- 放心用快充!1.25万辆特斯拉研究报告:快、慢充对电池寿命影响不大
- 网友吐槽2G手机变砖 运营商表态:正推进5G升级
- 《白雪公主》电影或将延期!已被迪士尼要求重新拍摄
- 国庆再刷一遍?《封神第一部》宣布延长上映至10月19日:狂揽24.57亿票房
- 我国最大油田天然气累产突破6000亿
- 大连原中昊光明化工研究设计院改造地块中止交易 建面7.05万平
- 浙商证券:给予星源材质增持评级
手机
秋收季 如何减损增产保丰收?专家来支招→
泰国王室继承权有变?海外流亡2个王子回国赚人气,发言话里有话
- 秋收季 如何减损增产保丰收?专家来支招→
- 泰国王室继承权有变?海外流亡2个王子回国赚人气,发言话里有话
- 今年夏天不兴白衬衫了!满大街都在穿“多巴胺衬衫”,洋气又高级
- 怎么在ps里查看图片尺寸(ps中怎么查看图片尺寸)
- 8月份专项债发行明显提速 专家称对下半年投资拉动效应将逐步显现
- 为什么老虎不会被饿死而老年狮子会?揭秘这个奇怪现象
家电
域套接字sendto errno -11分析
sendto errno -11代码分析
errno -11在内核代码中代表EAGAIN(再试⼀次),域套接字sendto过程中sendto->sock_sendmsg->unix_dgram_sendmsg
,在unix_dgram_sendmsg
中有两处会返回 EAGAIN:第1处:sock_alloc_send_pskb
第2处:other!=sk&&unlikely(unix_peer(other)!=sk&&unix_recvq_full_lockless(other))
unix_peer(sk)!=other||unix_dgram_peer_wake_me(sk,other)
当以上两个条件都满⾜时也会返回 EAGAIN。另外需要注意的是unix_dgram_sendmsg
中直接通过skb_queue_tail(&other->sk_receive_queue,skb)
将数据放⼊了对端的接收队列中。
(资料图片仅供参考)
第1处sock_alloc_send_pskb
函数中当socket发送缓冲区满时(sk_wmem_alloc_get(sk)>=sk->sk_sndbuf
)将返回 EAGAIN。第2处
在 Linux 内核源代码中,unix_peer(other) != sk 表⽰另⼀个 Unix 域套接字( other )的对端套接字(peer socket)不等于当前套接字( sk )本⾝。在 Unix 域套接字通信中,每个发起连接的进程(或线程)都必须创建两个⽂件描述符,⼀个⽤于客⼾端(client),称为客⼾端套接字(client socket),另⼀个⽤于服务器端(server),称为服务器套接字(server socket)。这两个套接字通过 Unix 域⽂件系统中的某个路径名进⾏连接(bind)。当对等⽅成功建⽴连接后,两个套接字中的⼀个将⾃动成为对⽅的对端套接字(peer socket)。这意味着两个对等⽅都有⼀个指向对⽅套接字的结构体,也就是所谓的“peersocket”。因此,unix_peer(other) != sk 表⽰当前套接字( sk )不是另⼀个 Unix 域套接字( other )的对端套接字。如果这个条件成⽴,那么就不能向 other 套接字发送数据,因为 other 并不是当前套接字的对端套接字,这种情况下发送数据可能会引发错误或者产⽣不确定的结果
unix_peer() 函数尝试返回指向当前 Unix Domain 套接字的对端套接字的指针,如果当前套接字不是连接状态或者没有对端套接字则返回空指针。该函数通常⽤于判断当前Unix Domain 套接字是否有对端套接字,以决定是否可以进⾏数据发送。
other!=sk
, 因为other=unix_peer_get(sk)
(其实就是other=sk->peer
) ,该条件意味着sk->peer!=sk
,在域套接字中 sk代表通信的⼀端,sk->peer代表通信的另⼀端,该条件是为了避免循环引⽤。本⽂档中默认 sk是客⼾端,other是服务端。unlikely(unix_peer(other)!=sk&&unix_recvq_full_lockless(other))
,⾸先unix_peer(other)!=sk
意味着sk->peer->peer!=sk
说明 sk客⼾端所指向的服务端发⽣了变化(⽐如在客⼾端发送的过程中⼜有⼀个新的客⼾端与服务端建⽴了连接),其次是unix_recvq_full_lockless(other)
如下⾯代码所⽰,当条件满⾜时代表着 other服务端接收队列深度⼤于sk_max_ack_backlog
。
af_unix.c:static inline int unix_recvq_full_lockless(conststructsock*sk){return skb_queue_len_lockless(&sk->sk_receive_queue)>READ_ONCE(sk->sk_max_ack_backlog);}
unix_peer(sk)!=other||unix_dgram_peer_wake_me(sk,other)
,unix_peer(sk)!=other
⽤于判断当前 Unix Domain 套接字( sk )是否为另⼀个 Unix Domain 套接字(other )的对端套接字,这⾥只能是other发⽣了变化 ;在unix_dgram_peer_wake_me
中只有other端接收队列深度⼤于sk_max_ack_backlog
时才会return 1
。
af_unix.c:static inline int unix_recvq_full(conststructsock*sk){return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog;}static int unix_dgram_peer_wake_me(structsock*sk, structsock*other){int connected;connected = unix_dgram_peer_wake_connect(sk,other);if(unix_recvq_full(other))return 1;if(connected)unix_dgram_peer_wake_disconnect(sk,other);return 0;}
总结
域套接字sendto errno -11存在以下可能:
- socket发送缓冲区满(可复现)。
- other的对端不是sk(本客⼾端)并且
unix_recvq_full_lockless
成⽴2.1 sk(本客⼾端)的对端也不是other。2.2 other接收队列深度⼤于sk_max_ack_backlog
(可复现)。
条件2中 unix_recvq_full_lockless
,代表other接收队列深度⼤于sk_max_ack_backlog
,不过这⾥ unix_recvq_full_lockless
调⽤的是 skb_queue_len_lockless
是不加锁的,因此这⾥存在不确定性,但⾄少内核得到的信息是other接收队列深度⼤于sk_max_ack_backlog
。
条件2.1和2.2成⽴的前提是条件2先成⽴。针对条件2.1成⽴的可能性:1)sk 与 other 建链,此时sk->peer==other,other==sk->peer
。2)new_sk(新的客⼾端)与other建链,此时sk->peer==other,other->peer!=sk,other->peer==new_sk,new_sk->peer==other
。3)new_sk⾼速发消息到other使 unix_recvq_full_lockless
条件满⾜。4)sk发消息进⼊unix_dgram_sendmsg
内部并到达unlikely(unix_peer(other)!=sk&&unix_recvq_full_lockless(other))
之后并且在 unix_peer(sk)!=other|| unix_dgram_peer_wake_me(sk,other)
之前的位置时,other端重新初始化了,条件 unix_peer(sk)!=other
满⾜。
在sendto的过程中重新初始化other,⽬前没有很好的复现⽅法。
当客⼾环境并没有使⽤socketpair
和 connect
,那么sk->peer和other->peer并没有相互引⽤,并且 other->peer==NULL
。因此other的对端不是sk(本客⼾端)并且sk(本客⼾端)的对端也不是other,在这种情况下当other接收队列深度⼤于sk_max_ack_backlog
时,将返回 EAGAIN(error -11)。事实上,unix_dgram_sendto
返回 EAGAIN时,要么 socket发送缓冲区满 ,要么 other接收队列深度⼤于sk_max_ack_backlog
,因为如果第1个if不成⽴(条件2),那么第2个if也不会成⽴(条件2.1、条件2.2)。
调试手段
#sysctl-a|grepunixnet.unix.max_dgram_qlen=512#sudosysctl-a|grep"net.core.wmem"net.core.wmem_default=2097152net.core.wmem_max=2097152
net.unix.max_dgram_qlen 代表缓冲区队列深度(缓冲区中有多少个数据包)net.core.wmem_max 代表缓冲区最⼤⼤小(所有数据包的总⻓度)针对errno -11, 可适当增加net.unix.max_dgram_qlen 的⼤小。
发送缓冲区溢出判断
#include#includelong outq=0;ioctl(sockfd,SIOCOUTQ,&outq);
errno -11 前后可根据该代码获取发送缓冲区的⼤小并与net.core.wmem_max
对⽐。
kprobe 监控socket 缓冲区是否溢出
kprobe监控sock_alloc_send_pskb、unix_dgram_peer_wake_me
add_kprobe_event "r:probeE1 sock_alloc_send_pskb $retval" set_kprobe_event_filter "arg1 == 0" probeE1 add_kprobe_event "r:probeE2 unix_dgram_peer_wake_me $retval" set_kprobe_event_filter "arg1 == 1" probeE2 add_kprobe_event "r:probeE3 unix_dgram_sendmsg $retval" set_kprobe_event_filter "arg1 == 0xfffffff5" probeE3 enable_trace_event "sock/sock_rcvqueue_full" enable_trace_event "sock/sock_exceed_buf_limit"
附
skb_queue_len 和 skb_queue_len_lockless区别
在 Linux 内核中,skb_queue_len 和 skb_queue_len_lockless 都是⽤于获取 sk_buff 队列⻓度的函数。这两个函数的差异在于函数调⽤时是否⽀持锁机制,具体描述如下:skb_queue_len() 是⼀个基于锁的队列⻓度计算函数,当需要获取 sk_buff 队列⻓度时,该函数会获取队列的⾃旋锁来保证队列在计算期间不发⽣并发修改。因为该函数对队列实⾏锁机制,当需要查询 sk_buff 队列⻓度时可能会受到锁的竞争和等待时延等因素的影响。skb_queue_len_lockless() 是⼀个不⽀持锁的队列⻓度计算函数,该函数可以在不加锁的情况下,快速获取 sk_buff 队列的实际⻓度。由于该函数不需要获取队列的锁,因此其执⾏速度快,但也可能在并发写⼊数据时因为⽆法保证数据⼀致性而产⽣错误的队列⻓度计算结果。根据内核实现,当我们希望检查队列的⻓度时,⼀般建议使⽤ skb_queue_len 而不是 skb_queue_len_lockless ,因为前者可以确保计算结果的准确性,并通过⾃旋锁确保计算过程不受并发修改的影响。而后者则主要⽤于在不需要确保 sk_buff 队列准确性的情况下快速计算其⻓度,⽐如有些地⽅例如数据处理中可能观察者只需要⼀个近似值,⽤skb_queue_len_lockless() 可以显著降低系统的开销。
unix_socketpair
Unix 域套接字提供了⼀种可靠的进程间通信机制,其中 unix_socketpair 是其中的⼀个函数。该函数⽤于创建⼀对相互连接的套接字,这两个套接字可以⽤于进程间的通信。具体来说,unix_socketpair 函数创建⼀对套接字(⼜称为 socket pair),这两个套接字在创建时已经互相连接。这意味着,对其中⼀个套接字进⾏任何操作都会直接影响另⼀个套接字。因此,可以使⽤这对套接字进⾏进程间通信,⽐如在两个进程之间传递⽂件描述符、管道、消息等。两个套接字在创建时有以下特点:套接字对是由内核创建的,不依赖于⽂件系统中存在的⽂件。套接字对是⼀对⼀的,即⼀个套接字只能被⼀个进程所拥有,而另⼀个套接字只能被另⼀个进程所拥有。套接字对是双向的,即它们既可以⽤于读也可以⽤于写。套接字对是数据传输的最小单位,因此数据交换的时候也是传输整块数据,不能传输部分数据。unix_socketpair 函数的调⽤⽅式如下:
#include
int socketpair(int domain, int type, int protocol, int sv[2]);
其中 domain 参数⽤于指定套接字协议簇,type 参数⽤于指定套接字类型,protocol 参数⽤于指定协议类型。sv 参数是⼀个已经分配好的数组,⽤于返回 socket pair 的描述符。调⽤成功将返回 0,否则返回 -1。
connect操作
在 Unix 域套接字中,unix_dgram_connect 函数⽤于建⽴连接并指定该连接的⽬标套接字地址。该函数主要⽤于 Datagram 套接字的客⼾端,能够为该套接字指定⼀个默认的⽬标地址,以便在后续的发送操作中⽆需再指定⽬标地址。unix_dgram_connect 函数的具体作⽤如下:建⽴连接。连接建⽴后,套接字就可以直接向指定的⽬标地址发送数据,不再需要每次都指定⽬标地址。指定默认⽬标地址。连接建⽴后,可以使⽤ unix_dgram_sendmsg 等函数向默认⽬标地址发送数据。接收数据。经过 unix_dgram_connect 函数连接的套接字也可以接收从指定的⽬标地址发送过来的数据。请注意,unix_dgram_connect 函数并不是必须的,如果在套接字操作中指定了⽬标地址,则会⾃动建⽴连接。但是通过 unix_dgram_connect 函数建⽴连接可以使得发送数据等操作更加⽅便。unix_dgram_connect 函数的函数原型如下:
#include
int unix_dgram_connect(int sockfd, const struct sockaddr_un* addr, socklen_t addrlen);
其中 sockfd 参数是待连接套接字的⽂件描述符,addr 参数是⽬标套接字地址,addrlen 参数是⽬标套接字地址的⻓度。调⽤成功将返回 0,否则返回 -1。
sendtosendto时如果other不存在,则会主动通过地址和路径去寻找other,然后通过unix_may_send
是否可以发送,允许发送的条件是 other->peer==NULL or other->peer==sk
。
关键词:
域套接字sendto errno -11分析
空调吹出来是脚臭味对身体有影响吗_空调吹出来是脚臭味
合众思壮08月28日获深股通增持57.2万股
马斯克吹的牛,小鹏要实现了?
老乡鸡撤回主板IPO申请,原计划募资12亿元
奇葩!2亿元买私募基金,一度亏成负数!这家公司遭处罚
隔夜欧美·8月29日
花季少女服药轻生 公安搜救3小时脱险
下载哔哔视频怎么下载(哔哩哔哩下载的视频在哪个文件夹)
秋收季 如何减损增产保丰收?专家来支招→
科隆:《红色沙漠》发布新预告展示壮丽世界激烈战斗
经济观察:中国超四分之三人口能上网意味着什么
泰国王室继承权有变?海外流亡2个王子回国赚人气,发言话里有话
【东西问·中外对话】剑桥大学教授:应避免以“欧洲中心论”看待文明发展
水质专员康静伟和王嘉希:只为这一泓清水永续北上
中储智运第三届百日安全竞赛入选2023年度“暖途货车司机职业发展与保障行动”
兴证策略:印花税调降后市场表现有何特征?
尴尬!黄渤被粉丝当面质问为什么演烂片,高情商回答拯救全场
微信又立功了!江苏美女晒2名领导送她情趣内裤和香蕉,官方回应
今年夏天不兴白衬衫了!满大街都在穿“多巴胺衬衫”,洋气又高级
财鑫闻丨鲁西化工:上半年实现营收115亿元 产能释放未来可期
科技部负责同志解读《关于进一步加强青年科技人才培养和使用的若干措施》
黄金城道上这家“茶铺”,把茶玩出了新花样~
怎么在ps里查看图片尺寸(ps中怎么查看图片尺寸)
打印机万能驱动下载(打印机万用驱动)
歌华有线:8月28日融券净卖出11.55万股,连续3日累计净卖出29.48万股
收紧、限劣、“网开一面”!IPO、再融资新规超预期
夜空下的老牛湾
8月份专项债发行明显提速 专家称对下半年投资拉动效应将逐步显现
市场监管总局等4部门部署校园食品安全工作
比特币“失宠”?交易量跌至2018年来最低水平
销售量、销售额均增长19%,空调引领家电业增长
为什么老虎不会被饿死而老年狮子会?揭秘这个奇怪现象
外媒:土耳其外长会见泽连斯基,还将访问俄罗斯
海看股份(301262):使用募集资金置换预先已投入募投项目及已支付发行费用的自筹资金
六合龙池新增商业综合体
黄奕电影上映时间(黄奕新电影龙棺古墓
悦达投资:8月28日获融资买入283.34万元,占当日流入资金比例10.16%
思科瑞:8月28日融券卖出金额57.42万元,占当日流出金额的2.05%
酿酒葡萄种植技术与管理(葡萄种植技术与管理)
英特尔明年推出数据中心芯片“Sierra Forest”,能效大幅提高
美股三大指数集体走高 原油黄金双双上涨
7-0!马竞取得队史西甲客场最大比分胜利 本世纪第2次7球大胜
取钢钉意外险能报销吗?能报销多少钱?
一人之下|纯白与灰?即便没有全性,李慕玄也做不了左若童之徒!
外汇百晓生:黄金震荡,等待1908附近机会多
赛百味700亿“卖身” 关闭8000家门店!崛起到陨落经历了什么?
钢铁侠用一张图教你如何分辨美国队长和克里斯埃文斯
助力企业从IP到IPO跑出新速度 “IP数智领航”培育具备知识产权核心竞争力的一流企业
我国互联网普及率达76.4% 数字经济新动能持续释放
中央气象台发布暴雨蓝色预警:川西高原中部等地部分地区有大到暴雨
铜概念行业上市公司股票有哪些?(2023/8/29)
2023年碳酸锂公司上市龙头出炉(8月29日)
地产股"涨声一片",20亿元主力资金涌入,机构称楼市有望迎来筑底回暖
花钱还挨骂?这届零零后要“整顿”驾校
公司会计网络赌博一掷千金 侵占公司款项2780余万元获刑
视频|“中大奖”都是诈骗!民警邀您下载国家反诈中心APP
成都温江区鲁家滩潮流运动消费场景入选2023年度四川省“蜀里安逸”消费新场
阿尔法企业(00948.HK):陈煦辞任执行董事
聚焦降本增效A股五大快递公司上半年业绩齐增
华海清科(688120.SH):上半年净利润3.74亿元,同比增长101.44%
一加Ace 2 Pro原神派蒙主题礼盒开箱 深度定制不容错过
夏季想要将裙子穿出时尚感,这三个关键点别忽略,学会了优雅显瘦
新方法实现中红外光室温探测
保健食品新规发布 体现三大监管创新
三江购物08月28日获沪股通增持28.59万股
壁炉天然气装在屋里安全吗(天然气壁炉的优缺点)
[快讯]凯利泰2023上半年盈利1.15亿元 将积极扩展新业务线
“号贩子”再度猖獗,整治老问题当有新思路
新疆巴州:“百里花廊”靓戈壁 红柳簇簇散芬芳
榫卯中见东方智慧,60余件非遗家具亮相恭王府
新疆首笔“带押过户”二手住房贷款业务成功落地
梦见刮大风下大雨是什么意思
上班时发病请假回家而死亡有赔偿吗
儿子突然出现送惊喜挨了妈妈一巴掌这一巴掌满满都是妈妈的爱 具体是啥状况呢
常州市住建局:推进建筑领域光伏应用,助力“新能源之都”建设
研究显示自动驾驶软件存“偏见”,有色人种和儿童面临更高碰撞风险
受人好评,今年都有事业好前景的生肖,前后左右都一帆风顺
冀中能源08月28日被深股通减持855.32万股
暴雨黄色预警:10省区有大到暴雨 山东辽宁西藏等地局地有大暴雨
立竿见影!13家上市公司大股东终止减持,响应监管要求
又一部王炸!张晚意新剧,做对了什么?
紫光股份:搭载英伟达A800 GPU的AI服务器已进入批量交付阶段
“声音里的经典”宁夏回族自治区职工诵读演说大赛在银川收官
三星挺无奈,GalaxyS23+直降1802元,变“香”了但无人问津
生态“七景”造就文旅“奇景”
收藏!大庆市区充电桩和充电终端分布大全来啦!
10.79亿网民如何共享美好数字生活?——透视第52次《中国互联网络发展状况统计报告》
以实际行动把红旗渠精神发扬光大
今年最大最亮满月30日登场
1分钟卖5辆、1辆赚3.4万!比亚迪毛利超特斯拉:上半年赚翻了
放心用快充!1.25万辆特斯拉研究报告:快、慢充对电池寿命影响不大
网友吐槽2G手机变砖 运营商表态:正推进5G升级
《白雪公主》电影或将延期!已被迪士尼要求重新拍摄
国庆再刷一遍?《封神第一部》宣布延长上映至10月19日:狂揽24.57亿票房
A股限售股解禁一览:223.18亿元市值限售股今日解禁
我国最大油田天然气累产突破6000亿
大连原中昊光明化工研究设计院改造地块中止交易 建面7.05万平
浙商证券给予劲仔食品买入评级
台风“苏拉”将影响我国东南沿海 北方多地开启入秋进程