Go语言中文网 为您找到相关结果 83

LollipopGo开源游戏服务器框架--网络基础模块源码

大家好,我是彬哥,本节给大家讲下LollipopGo游戏服务器NetBase.go,抛砖引玉了,主要是针对Go语言游戏服务器网络处理。 package main import ( "encoding/json" "fmt" "Proto" "Proto/Proto2" "code.google.com/p/go.net/websocket" ) func wwwGolangLtd(ws *websocket.Conn) { // fmt.Println("Golang语言社区 欢迎您!", ws) // data = json{} data := ws.Request().URL.Query().Get("data") fmt.Println("data:", data) NetDataCo...阅读全文

博文 2019-01-04 07:34:43 Golang语言社区

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢g...阅读全文

博文 2016-08-23 00:00:02 sheepbao

常见加密算法入门

参考 https://www.jianshu.com/p/ce3893a7be09 比特币的加密算法 https://www.jianshu.com/p/57fc42456ab4 分类和简述 常见的密钥加密算法类型大体可以分为三类:对称加密(单秘钥加密)、非对称加密、单向加密(结果唯一且计算过程可重复但是计算不可逆) 对称加密算法 对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方;接收方收到加密后的报文后,结合密钥和解密算法解密组合后得出原始数据。由于加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。而密钥通常来说是通过双方协商,以物理的方式传递给对方,或者利用第三方平台传递给对方,一旦这过程...阅读全文

博文 2018-12-04 11:34:46 黄靠谱

运维架构服务监控Open-Falcon

一、 介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择。当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案。之后,随着业务规模的持续快速增长,监控的对象也越来越多,越来越复杂,监控系统的使用对象也从最初少数的几个SRE,扩大为更多的DEVS,SRE。这时候,监控系统的容量和用户的“使用效率”成了最为突出的问题。 监控系统业界有很多杰出的开源监控系统。我们在早期,一直在用zabbix,不过随着业务的快速发展,以及互联网公司特有的一些需求,现有的开源的监控系统在性能、扩展性、和用户的使用效率方面,已经无...阅读全文

博文 2017-10-12 11:04:55 小红牛

软件技术-零基础Golang编写文件服务器

欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】 当用户请求一个网页的时候,如何让服务器把网页文件发送给用户? 文件服务器 首先我们要知道,用户在浏览器中看到的页面其实就是一个.html文件,就是我们上一篇文章时候撰写的...代码。 但我们最初用Golang写的服务器只是简单返回Hello world!字符串,而不是文件。所以,正确的做法是: 让Golang读取硬盘上的文件内容,然后发送给用户。 这就是文件服务器要干的事情,你要login.html页面,我就给你login.html文件。 在Golang里面,已经提供了快速建立文件服务的功能,就是http.FileServer方法,但是首先要知道我们的web文件夹放在哪里。 获取当前文件路径 在Gola...阅读全文

博文 2019-03-27 02:34:38 zhyuzh3d

运维架构服务监控Open-Falcon

一、 介绍监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择。当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案。之后,随着业务规模的持续快速增长,监控的对象也越来越多,越来越复杂,监控系统的使用对象也从最初少数的几个SRE,扩大为更多的DEVS,SRE。这时候,监控系统的容量和用户的“使用效率”成了最为突出的问题。监控系统业界有很多杰出的开源监控系统。我们在早期,一直在用zabbix,不过随着业务的快速发展,以及互联网公司特有的一些需求,现有的开源的监控系统在性能、扩展性、和用户的使用效率方面,已经无法支...阅读全文

博文 2017-10-12 08:38:13 猫饭先生

TCP连接的状态变迁

全部11种状态 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。 服务器独有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。 共有的:(1)CLOSED (2)ESTABLISHED 。 ![image.png](https://static.studygolang.com/190222/c1b69cd34b964ea79036a1f00b187f9f.png) 状态变迁 1、建立连接时的状态变迁 一开始,建立连接之前服务器和客户端的状态都为CLOSED。服务器创建socket后开始监听,变为LISTEN状态。客户端请求建立连接,向服务器发送SYN...阅读全文

Go语言入门(十) Mysql与Redis操作

Mysql与Redis操作 Mysql开发 安装mysql,创建test库 创建表 mysql> CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT '', `age` int(11) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; mysql> insert into user (name,age)values('jim',18) SQL查询 单行查询: Db.QueryRole 多行查询: Db.Query import ( "fm...阅读全文

博文 2020-04-11 08:33:15 wx5b285b48ed74e

【Golang】信号处理

golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。 Notify函数 原型: func Notify(c chan<- os.Signal, sig …os.Signal) 说明: 该函数会将进程收到的系统Signal转发给channel c,转发哪些信号由该函数的可变参数决定,如果你没有传入sig参数,那么Notify会将系统收到的所有信号转发给c。 使用: 1.监听全部信号 package main import ( "fmt" "os" "os/signal" ) func main() { //创建chan c := make(chan os.Signal, 1) //buffered ch...阅读全文

Prometheus快速了解

概览 Prometheus是一个独立的开源监控系统。其组成主要有时序数据库、数据采集、数据查询(PromQL查询语言)和报警。先看一下Prometheus结构图 Prometheus工作流程 先得部署一个被监控的应用:App。 让App和Prometheus通信才能达到监控的目的。 将app关联到Prometheus,即在Prometheus中配置被监控App的位置信息。 需要采集app的数据,App就得按照Prometheus提供的规则编写Http接口。 数据采集两种方式: 比如Java应用,可以在Java应用中引入相关依赖,提供Prometheus采集数据的pull接口。 提供exporter做为中间层适配数据采集。 Prometheus按时通过该接口pull数据,即达到数据采集的目的。...阅读全文

Golang学习笔记之简易聊天系统服务器的搭建

下面先列举一下程序使用到的函数,省的大家去找,直接拷贝官方api的解释吧。 func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) DialTCP在网络协议net上连接本地地址laddr和远端地址raddr。 net必须是"tcp"、"tcp4"、"tcp6";如果laddr不是nil,将使用它作为本地地址,否则自动选择一个本地地址。 func ResolveTCPAddr(net, addr string) (*TCPAddr, error) ResolveTCPAddr将addr作为TCP地址解析并返回。 参数addr格式为"host:port"或"[ipv6-host%zone]:port",解析得到网络名和端...阅读全文

博文 2018-12-14 17:34:42 学生黄哲

WebSocket的实现原理

WebSocket的实现原理 一、什么是websocket Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。即:websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接。 下面我们分别来看一下这两个阶段的具体实现原理: 1、握手阶段 客户端发送消息: GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com ...阅读全文

博文 2019-03-18 18:34:41 yongfutian

go综合实例之发布订阅模型

``` import ( "fmt" "strings" "sync" "time" ) type ( subscriber chan interface{} //订阅者 topicFunc func(v interface{}) bool //主题过滤器 ) type Publisher struct { m sync.RWMutex //读写锁 buffer int //订阅队列缓存大小 timeout time.Duration //发布超时 subscribers map[subscriber]topicFunc //订阅者信息 } //新建一个发布者对象,可以设置发布超时和缓存队列打长度 func NewPublisher(publishTimeout time.Duration,...阅读全文

博文 2019-07-16 13:18:34 skeyboy

第三十章: Go语言与RabbitMQ

RabbitMQ 概述 RabbitMQ是采用Erlang编程语言实现了高级消息队列协议AMQP (Advanced Message Queuing Protocol)的开源消息代理软件(消息队列中间件) 市面上流行的消息队列中间件有很多种,而RabbitMQ只是其中比较流行的一种 我们简单说说消息队列中间件的作用 解耦 削峰 异步处理 缓存存储 消息通信 提高系统拓展性 RabbitMQ 特点 可靠性 通过一些机制例如,持久化,传输确认等来确保消息传递的可靠性 拓展性 多个RabbitMQ节点可以组成集群 高可用性 队列可以在RabbitMQ集群中设置镜像,如此一来即使部分节点挂掉了,但是队列仍然可以使用 多种协议 原生的支持AMQP,也能支持STOMP,MQTT等协议 丰富的客户端 我们...阅读全文

博文 2020-02-24 01:32:45 captain89

Golang中range指针数据的坑

在Golang中使用for range语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。 下面的代码中定义了一个元素类型为*int的通道ch: package main import ( "fmt" ) func main() { ch := make(chan *int, 5) //sender input := []int{1,2,3,4,5} go func(){ for _, v := range input { ch <- &v } close(ch) }() //receiver for v := range ch { fmt.Println(*v) } } 在上面代码中,发送方将input数组发送给ch通道,接收方再从ch通道中接收数据,程序的预期输出应该是: 1 2 3...阅读全文

博文 2019-02-01 19:34:43 灯风罩戟

nsq (三) 消息传输的可靠性和持久化[一]

上两篇帖子主要说了一下nsq的拓扑结构,如何进行故障处理和横向扩展,保证了客户端和服务端的长连接,连接保持了,就要传输数据了,nsq如何保证消息被订阅者消费,如何保证消息不丢失,就是今天要阐述的内容。 nsq topic、channel、和消费我客户端的结构如上图,一个topic下有多个channel每个channel可以被多个客户端订阅。 消息处理的大概流程:当一个消息被nsq接收后,传给相应的topic,topic把消息传递给所有的channel ,channel根据算法选择一个订阅客户端,把消息发送给客户端进行处理。 看上去这个流程是没有问题的,我们来思考几个问题 网络传输的不确定性,比如超时;客户端处理消息时崩溃等,消息如何重传; 如何标识消息被客户端成功处理完毕; 消息的持久化,n...阅读全文

如何发送给客户端响应之后程序继续执行

写PHP的时候遇到一个问题 *如何在把响应发送给客户端之后,继续执行后续任务? * 在stackoverflow上找到解决方案,如下 https://stackoverflow.com/questions/15273570/continue-processing-php-after-sending-http-response 想知道,如何在Golang中实现这种需求,google了一会没能找到,汗... 求助,能赐几行代码更好,多谢:...阅读全文

以太坊源码分析:共识(1)矿工

前言 矿工在PoW中负责了产生区块的工作,把一大堆交易交给它,它生成一个证明自己做了很多工作的区块,然后将这个区块加入到本地区块链并且广播给其他节点。 接下来我们将从以下角度介绍矿工: 角色。矿工不是一个人,而是一类人,可以把这一类人分成若干角色。 通过了解一个区块产生的主要流程,掌握矿工的工作流。 通过了解矿工的主要函数介绍,掌握矿工的主要挖矿机制。 介绍矿工由哪些部分组成,会和哪些其他模块进行交互,这些部分是如何协作产生区块的。 角色 有3种角色:miner、worker、agent。我们分别使用矿长、副矿长、矿工进行类比。 miner:是矿长,负责管理整个矿场的运作,比如:启动、停止挖矿,处理外部请求,设置挖矿获得的奖励的钱包地址等等。 worker:副矿长,负责具体挖矿工作的安排,把...阅读全文

博文 2018-11-17 12:34:38 大彬

图解kubernetes中informer机制基础设计原理

kubernetes中的informer机制可能是实现集群控制模块的最核心的设计之一了,本文从informer如何获取数据开始,然后介绍了为了减少apiserver而设计的缓存、索引、无界队列、共享informer等机制欢迎一起交流学习 1. informer的本质 1.1 设计目标 之前说到kubernetes里面的apiserver的只负责数据的CRUD接口实现,并不负责业务逻辑的处理,所以k8s中就通过外挂controller通过对应资源的控制器来负责事件的处理,controller如何感知事件呢?答案就是informer 1.2 基于chunk的消息通知 watcher的设计在之前的文章中已经介绍,服务端是如何将watcher感知到的事件发送给informer呢?我们提到过apise...阅读全文

Go语言:简介(二)

Go语言:简介(二) 对Go语言了解前,我们先来补一些基本概念 基本概念 并发程序 一个并发程序可以在一个处理器或者内核上使用多个线程来执行任务,但是只有同一个程序在某个时间点同时运行在多核或者多处理器上才是真正的并行。 并发程序可以是并行的,也可以不是。 多线程缺点 使用多线程的应用难以做到准确,最主要的问题是内存中的数据共享,它们会被多线程以无法预知的方式进行操作,导致一些无法重现或者随机的结果。 使用多线程需要在意同步问题,可能出现死锁,线程上下文切换带来的开销 单线程中大计算量问题 利用多核CPU,将计算分发到各个子进程,将大量的计算分解掉,然后再通过进程间的事件消息来传递结果。 什么是协程 goroutines(协程) 1.协程与线程关系 在协程和操作系统线程之间并无一对一的关系:...阅读全文

golang实现基于TCP协议的简单的C-S架构

一、SERVER端 package main import ( "fmt" "net" "runtime" "strings" ) func handleConn(conn net.Conn) { defer conn.Close() ip := conn.RemoteAddr() fmt.Println("客户端已连接---", ip) //读取客户端数据 buf := make([]byte, 4096) for { n, err := conn.Read(buf) if n == 0 { fmt.Println("客户端断开连接") runtime.Goexit() } if err != nil { fmt.Println("conn.Read err:", err) return ...阅读全文

博文 2019-07-25 13:32:41 七八个星天

golang遇到docker很简单

本文转自:https://www.cnblogs.com/angelyan/p/11218260.html 一、获取镜像指定版本,该版本包含了web控制页面 docker pull rabbitmq:management 二、运行镜像 方式一:默认guest 用户,密码也是 guest docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management 方式二:设置用户名和密码 docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAU...阅读全文

博文 2019-12-31 14:32:50 mick_

Kafka 重平衡机制

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。 重平衡的作用 重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下: image.png 从图中可以找到消费组模型的几个概念: 同一个消费组,一个分区只能被一个消费者订阅消费,但一个消费者可订阅多个分区,也即是每条消息只会被同一个消费组的某一个消费者消费,确保不会被重复消费; 一个分区可被不同消费组订阅,这里有种特殊情况,加...阅读全文

博文 2019-10-31 20:33:01 aside section._1OhGeD

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(二)

ping方法与pending的处理,之前谈到了pending是等待一个reply。 这里通过代码来分析是如何实现等待reply的。pending方法把pending结构体发送给addpending. 然后等待消息的处理和接收。 // ping sends a ping message to the given node and waits for a reply. func (t *udp) ping(toid NodeID, toaddr *net.UDPAddr) error { // TODO: maybe check for ReplyTo field in callback to measure RTT errc := t.pending(toid, pongPacket, fun...阅读全文

博文 2018-10-17 14:34:42 兄弟连区块链培训

[CatServer 服务器框架] Group 新调度实现

# 调度包实现 ## 实现 ### 调度定义 > 采用 生产消费 的处理方式 > > 1. 创建多个消费者 > 2. 将生产的值发送给消费者 > 3. 在关闭消费者的情况下挂起生产者 > 4. 在无法消费的情况下储存到缓冲队列,并通知回调函数. > 5. 关闭调度时等待缓冲队列与剩余调度执行完成. > > 注: > > >1. 超时回调会挂起调度 > >2. 在回调中调用 Close/SetWorker 需要携程运行 #### 1. 创建消费者 > 创建一个缓冲为 n 的消费者通道 ```go var consumer chan interface{} // 消费者 consumer = make(chan interface{}, n) ``` #### 2. 创建生产者 ```go va...阅读全文

golang context

最初接触golang http源码的时候就发现有一个比较特别的package context,并且在后面学习etcd源码的时候发现几乎每一个回调相关的函数都会有一个ctx参数,顺便了解下它的实现原理以及设计思想。 context 的作用 context结合自己工作实践,我认为context主要有以下两个作用: 1.传递数据 2.递归的取消子任务   context包在golang源码的golang.org/x/net/context目录下,context主要用在结束若干个相互具有父子(主任务子任务)关系的goroutine,context内部本身就是以一种树形递归的形式去组织各个context节点,父节点的取消,会递归的把取消信号发送给它的子节点。 Context接口的定义如下: type ...阅读全文

博文 2019-12-29 21:32:39 GGGGGGGG_8721

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(二)

ping方法与pending的处理,之前谈到了pending是等待一个reply。 这里通过代码来分析是如何实现等待reply的。pending方法把pending结构体发送给addpending. 然后等待消息的处理和接收。 // ping sends a ping message to the given node and waits for a reply. func (t *udp) ping(toid NodeID, toaddr *net.UDPAddr) error { // TODO: maybe check for ReplyTo field in callback to measure RTT errc := t.pending(toid, pongPacket, fun...阅读全文

博文 2018-10-17 14:35:13 itxdl2006

兄弟连区块链入门教程eth源码分析p2p-udp.go源码分析(二)

ping方法与pending的处理,之前谈到了pending是等待一个reply。 这里通过代码来分析是如何实现等待reply的。pending方法把pending结构体发送给addpending. 然后等待消息的处理和接收。 // ping sends a ping message to the given node and waits for a reply. func (t *udp) ping(toid NodeID, toaddr *net.UDPAddr) error { // TODO: maybe check for ReplyTo field in callback to measure RTT errc := t.pending(toid, pongPacket, fun...阅读全文

博文 2018-10-17 17:34:41 兄弟连区块链培训

golang实现基于UDP协议的简单的C-S架构

与TCP相比,UDP的服务器和客户端之间不用建立持久的连接,数据传输更加高效,但稳定性和安全性较差 一、服务器 package main import ( "fmt" "net" "time" ) func main() { //建立udp服务器结构体 udpServer, err := net.ResolveUDPAddr("udp", "127.0.0.1:8001") if err != nil { fmt.Println("net.ResolveUDPAddr err", err) return } //创建udp监听服务 conn, err := net.ListenUDP("udp", udpServer) defer conn.Close() if err != nil { f...阅读全文

博文 2019-07-25 13:32:39 七八个星天

Go Web 编程--如何确保Cookie数据的安全传输

什么是Cookie Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。 Cookie主要用于以下三个方面: 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息) 个性化设置(如用户自定义设置、主题等) 浏览器行为跟踪(如跟踪分析用户行为等) Go语言如何表示Cookie 在Go的net/http库中使用http.Cookie结构体表示一个Cookie数据,调用http.SetCookie函数则会告诉终端用户的浏览器把...阅读全文

博文 2020-03-08 16:33:04 Kevin

浅析Facebook LibraBFT与比原链Bystack BBFT共识

如果说什么是区块链的灵魂,那一定是共识机制。 它是区块链的根基。无论公链或是联盟链,共识机制都从基础上限制了区块链的交易处理能力和扩展性。 2019年6月18日,Facebook 发布了自己 Libra 项目的白皮书,引发广泛关注。作为 Facebook 试图创造国际流通数字货币的重要项目,Libra 区块链采用的是 LibraBFT 共识机制,是一个为 Libra 设计的鲁棒的高效的状态复制系统。它基于一种新型的 BFT 共识算法,HotStuff。 就在 Facebook Libra 项目白皮书发布之前不久,5月17日,比原链发布了 BaaS 平台 Bystack。这是一个一主多侧链架构的商用区块链系统,主链采用 PoW 共识保证多样资产安全和去中心化,侧链提供可插拔的共识以满足不同业务...阅读全文

博文 2019-07-03 15:03:42 比原链Bytom

消息队列 NSQ 源码学习笔记 (四)

> **nsq** 工具集学习 ### nsq\_to\_nsq nsq 作为消息队列,有个优势是nsqd 各节点之间是不关联的,如果一个节点出了问题,仅仅影响该节点下的topic,channel,以及相关的生产者、消费者。 也就是官方说明的特性第一条:**no SPOF** ( single point of failure 单点故障)。好处不言而喻,坏处也是有的,如果节点出问题,没有备份数据无法恢复。 所以,在官方提供了 nsq\_to\_nsq 作为 nsqd 节点复制的工具,用于做 nsqd 节点数据的备份, 或者也可以用于数据的分发。 类似于MirrorMaker. #### 特性: - 支持将M 个 topic 的消息 publish 到 N 个 nsqd...阅读全文

2.7 Socket Programming: Creating Network Applications

在网络应用开发中,开发者首先要做的一个决定是使用 TCP 还是 UDP 作为传输层协议。TCP 是基于连接,并且基于字节流提供可靠的数据传输的协议。而 UDP 是无连接,通过数据包发送数据,并不保证送达的协议。 我们将在这一节分别利用 UDP 和 TCP 实现一套 client-server 程序。 该程序主要完成的功能是: client 从键盘读取一行字符串,并发给 server server 收到字符串并转换成大写 server 将修改后的字符串发送给 client client 收到修改后的数据并显示 2.7.1 Socket Programming with UDP UDP 在发送数据包时,需要先在数据包中附加地址的信息。网络会利用这个信息 route 数据包到达接收程序。 附加的地...阅读全文

博文 2020-05-13 03:32:47 找不到工作