网络框架netpoll~Listener的fd支持poll

2024-06-11 18:36

本文主要是介绍网络框架netpoll~Listener的fd支持poll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络框架的Listener接口

扩展原生的net.listener

// Listener extends net.Listener, but supports getting the listener's fd.
type Listener interface {net.Listener// Fd return listener's fd, used by poll.Fd() (fd int)
}

原生的net.Listener

可以从表象知道,一个Listener要有什么能力

// A Listener is a generic network listener for stream-oriented protocols.
//
// Multiple goroutines may invoke methods on a Listener simultaneously.
type Listener interface {// Accept waits for and returns the next connection to the listener.Accept() (Conn, error)// Close closes the listener.// Any blocked Accept operations will be unblocked and return errors.Close() error// Addr returns the listener's network address.Addr() Addr
}

实现了框架中的Listener接口的listener

// 空赋值声明,用于检查类型实现。
// 这是对类型断言和接口实现的一种验证方式,但并不关注具体变量的值
// var _ net.Listener = ...:这里声明了一个未使用的匿名变量(下划线_),并尝试将其赋值为右侧的表达式结果
// 这行代码的目的不是为了创建或使用这个变量,而是利用Go编译器的类型检查特性,确保&listener{}类型的实例能够被赋值给net.Listener接口
// 如果listener类型没有实现net.Listener接口所需的所有方法,编译器会报错。
// 
// 静态检查listener类型是否实现了net.Listener接口的所有要求,而不实际创建或使用这个接口实例
// 这是一种常用的技巧,用于确保类型满足特定接口规范,有助于编写更健壮和明确的代码。
var _ net.Listener = &listener{}type listener struct {fd    intaddr  net.Addr       // listener's local addrln    net.Listener   // tcp|unix listenerpconn net.PacketConn // udp listenerfile  *os.File
}// 实现框架Listenr的Fd方法
func (ln *listener) Fd() (fd int) {return ln.fd
}

具体转换

func ConvertListener(l net.Listener) (nl Listener, err error) {// 接口之间也能断言?if tmp, ok := l.(Listener); ok {return tmp, nil}ln := &listener{}ln.ln = lln.addr = l.Addr()// 填充 ln.fd、ln.fileerr = ln.parseFD()if err != nil {return nil, err}return ln, syscall.SetNonblock(ln.fd, true)
}func (ln *listener) parseFD() (err error) {// interface.(type)语法允许检查接口变量的实际类型,并赋值给netln// type switch是Go语言中检查接口类型的一种更简洁、更高效的方法,而不是使用reflect包。这使得代码更易于阅读和维护。//// File returns a copy of the underlying os.File.// File:返回底层 os.File 的拷贝// It is the caller's responsibility to close f when finished.// Closing l does not affect f, and closing f does not affect l.// 关闭 ln 不会影响到 ln.file// 关闭 ln.file 不会影响到 ln//// The returned os.File's file descriptor is different from the// connection's. Attempting to change properties of the original// using this duplicate may or may not have the desired effect.// 返回的os.File的文件描述副不同于connection的// 利用该拷贝改变文件描述符的原始属性,可能会/可能不会有作用switch netln := ln.ln.(type) {case *net.TCPListener:ln.file, err = netln.File()case *net.UnixListener:ln.file, err = netln.File()default:return errors.New("listener type can't support")}if err != nil {return err}ln.fd = int(ln.file.Fd())return nil
}

这篇关于网络框架netpoll~Listener的fd支持poll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

[分布式网络通讯框架]----Zookeeper客户端基本操作----ls、get、create、set、delete

Zookeeper数据结构 zk客户端常用命令 进入客户端 在bin目录下输入./zkCli.sh 查看根目录下数据ls / 注意:要查看哪一个节点,必须把路径写全 查看节点数据信息 get /第一行代码数据,没有的话表示没有数据 创建节点create /sl 20 /sl为节点的路径,20为节点的数据 注意,不能跨越创建,也就是说,创建sl2的时候,必须确保sl

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( )   >   Update( )   >   LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有

Java中的集合框架使用技巧

Java中的集合框架使用技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中集合框架的使用技巧,这些技巧能够帮助我们更高效地处理数据和优化程序性能。 Java集合框架概述 Java集合框架提供了一组实现了各种集合接口的类和接口,用于存储和操作数据。它包括列表、集合、队列和映射等数据结构,能够满足不

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

C# 日志框架Serilog使用

1、框架和说明        C#日志框架Serilog支持多种场景输出,简单验证了一下,比较方便        包的安装,推荐直接使用“推荐NuGet包管理器”安装Serilog.AspNetCore,常见的组件都已经集成在一个包中,使用比较方便 2、配置文件        Serilog可以由配置文件来定义行为,而且配置文件的修改即时生效。参考配置文件如下: {"Serilog":