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

相关文章

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte