解决 gvm 工具无法下载安装包的问题

GVM(Go Version Manager) 是一款用于管理和切换不同 Go 语言版本的工具。它允许用户在同一台计算机上轻松安装、使用和管理多个 Go 版本,同时还能确保项目之间的依赖关系井然有序。 GVM 的主要功能包括: - 安装和卸载 Go 版本:GVM 允许用户快速安装和卸载 Go 语言的不同版本,以便在不同项目 ... 阅读更多

goland 配置 proto 文件搜索路径

默认情况下,goland(jetbrains 家的软件:idea 、 pycharm 、 phpstorm 以及 webstorm 都是一样) 安装 protobuf 插件后只会在一个特定的库路径下搜索 proto 文件。如果自定义了公共的头文件,导入的时候 goland 无法自动识别出来,显示无法解析 proto 文件 (报错为 「C ... 阅读更多

C++文件输入输出流 fstream 的基本用法

一、文件流 C++的 IO 类中定义了三个文件读写流 fstream 、 ifstream 以及 ofstream,它们都继承于相同的父类 istream,通过不同的实现以实现不同的文件流操作。 三者的区别为: ifstream:从文件读取数据 ofstream:从文件写入数据 fstream:既可以读数据、又可以 ... 阅读更多

C++11 中 const_cast 的真实使用场景

一、 const 和成员函数的故事 const 的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候 const 限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内不能修改数据成员,这应该是所有 C++程序员都烂熟于心的准则。但除了这两条准则以外,const 还有一些 ... 阅读更多

C++11 中的 override 和 final 关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过:

不通过的原因是:同时使用 virtual 和 override 关键字来修饰成员函数,virtual 关键字是多余的,要删掉。 说实话,刚开始看到错误提示的时 ... 阅读更多

如何通过原始套接字修改 IP 数据包头

背景:我们的设备上有个链路探测的功能,会定时请求公网的某个 IP 地址,以探测网络是不是连通的。具体的做法是会使用 icmp 或 dns 探测远端服务器,看请求能否正常响应,如果有响应,则认为链路正常,否则则认为不正常,需要采取对应的措施。但是问题的现象是每隔一段时间后,探测包就收不到回复了,导致我们认为线路异 ... 阅读更多

服务端的 socket 如何知道客户端是通过什么 IP 地址连接过来的

问题场景:服务器有多个网卡,分别绑定了地址 A 、地址 B 和地址 C,当客户端连接请求过来的时候,如何知道是从哪个 IP 地址请求过来的? 解决方案:服务端 accept 客户端的连接后,对这个新接受的 socket 进行 getsockname 就可以了。 示例代码: [crayon-6954a5b06c31f31208 ... 阅读更多

给 socket 分配随机端口

客户端的 socket 不需要手动执行 bind 绑定地址,但这不意味着客户端 socket 真的不需要绑定端口,实际上是内核它帮我们做了这个操作,在执行 connect 时,内核发现没有绑定端口,就会自动选择一个合适的端口绑定到 socket 。 当然这不说明我们不能对客户端 socket 执行 bind 操作,对于客户端 s ... 阅读更多

vector 中 emplace_back 方法的用途

在写代码的过程中,CLion 提醒我把 push_back 方法替换成 emplace_back 方法: emplace_back 函数的作用是减少对象拷贝和构造次数,是 C++11 中的新特性,主要适用于对临时对象的赋值。 在使用 push_back 函数往容器中增加新元素时,必须要有一个该对象的实例才行,而 empl ... 阅读更多