网络框架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

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase