环境与编译
GOREPLAY使用GO语言编写,源码下载后,安装好GO的运行环境,安装PCAP等linux应用后,还需要对GOREPLAY依赖的GO包进行下载并且放到指定的目录,GO通常是通过GIT获取依赖的包,但因为机器在内网,不能连接互联网,所以我采取的方式把依赖下载到本地,再上传到GO的GOPATH,按路径放好,最后go build可以编译出一个可运行的二进制可执行文件。
命令行参数
GOREPLAY支持很多种命令行参数。具体支持的命令行参数可以goreplay --help来查看,我们主要使用GOREPLAY转发HTTP,通常命令为:
goreplay --input-raw :8080 --output-tcp 10.60.20.8:8080
意思就是监听本机的8080端口,把8080端口上的数据报文转发到10.60.20.8:8080。
GOREPLAY是如何处理这些命令行参数的?首先从程序的入口说起,GO语言应用的默认入口在main函数。即在gor.go文件中。但go除了在Package main里的main是入口函数之外,还保留了另一个入口,即在任意package中的init函数。如setting.go中的init函数,该函数会在程序启动时甚至先于main执行。go的函数以及变量的初始化,可以深入读读,这里面有比较深的门路,不深入展开(真实的原因是现在我也不太熟^_^)。
go有一个命令行参数的处理模块,叫flag,使用的过程可以通过一个样例程序大概了解:
package main
import (
"flag"
"fmt"
)
func main() {
var src string
flag.StringVar(&src, "src", "", "source file")
var level *int
level = flag.Int("level", 0, "debug level")
var memo string
flag.StringVar(&memo, "memo", "", "the memory")
flag.Parse()
flag.Usage()
fmt.Printf("src=%s, level=%d, memo=%s\n", src, *level, memo)
}
执行 args.exe -src="123" -level=4 -memo="567",输出如下:
Usage of args.exe:
-level int
debug level
-memo string
the memory
-src string
source file
src=123, level=4, memo=567
大概的过程就是先绑定命令行上的key,parse时就真正的value取出到指定变量上。
继续加来goreplay源码,执行完setting.go里的init函数之后,即把命令行key与变更绑定,在main函数中的flag.parse()之后,即解析到setting的变量中,随后InitPlugins完成根据命令行指定参数模块的初始化加载。当前命令行为:
goreplay --input-raw :8080 --output-tcp 10.60.20.8:8080
即input_raw.go以及output_tcp.go会初始化加载,初始化过程也是挺多go的API的,有一些我也没有非常了解,类似一些反射之类的,还需要继续深入,但goreplay的命令行参数对程序运行影响大体的流程以及意义就像上面所说的了。后续我们要改造goreplay时,就知道如何增加命令行参数,并且增加对应的代码模块。
下一篇会真正真正进入如何解析TCP以及HTTP协议,完成对一个报文转发前的识别,敬请期待。
分享到:
相关推荐
chromium命令行参数1
最新的commons-cli,解析命令行参数,程序员必备,不要问我是谁,我叫雷锋,积分太多了,改了一下积分
WPf命令行参数事例 WPf命令行参数事例 WPf命令行参数事例
mfc程序获得命令行参数,vc6.0实现 // 获取命令行 CString strCommandLine = "获得的命令行参数为:"; strCommandLine += GetCommandLine(); MessageBox(strCommandLine);
c语言中命令行参数详解 c语言中命令行参数
VC++ MFC 支持 命令行参数 command line good
Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏命令行参数Linux部署jar包,隐藏...
vbMain(argc As Long, argv() As String)——VB自己的类C"主"函数 http://blog.csdn.net/dahual/archive/2011/04/16/6327958.aspx
执行程序时,经常会用到命令行参数传递参数这种方式,今天实战一个命令行参数的从头到尾。 博文虽长,但均为干货。 先写个主函数 #include int main(const int argc, const char* argv[]) //argc和argv的类型不一样...
编写一个程序,对用户由命令行参数传入的一个名称进行判断。如果是一个文件名,则输出该文件相关属性 ( 文件名、路径、绝对路径、是否可读、是否可写和文件的长度等 ) 。如果是一个目录,则输出该目录下的文件及子...
命令行参数捕获工具
flag包解析命令行参数
代码与我的一篇介绍命令行参数的博客相呼应, 里面包含了几张实验用的图片和两个py文件
nc-argparse是一个用C 编写的命令行参数解析器。 它支持子命令,位置参数,可选参数等
gzip文件功能及命令行参数介绍.ppt
minimist - 解析命令行参数选项
IEXPLORE命令行参数一览.txt
基于c#的命令行解析源码,包括测试例子,非常实用的哦
16.如何处理Windows应用程序的命令行参数?(Visual C++编程 源代码)16.如何处理Windows应用程序的命令行参数?(Visual C++编程 源代码)16.如何处理Windows应用程序的命令行参数?(Visual C++编程 源代码)16....
将第一个数字除以第二个数字并显示结果,处理可能的异常提示:使用两个catch语句,一个用于捕获ArrayIndexOutOfBoundsException异常(从命令行传来的参数个数不对),而另一个用于捕获ArithmaticException异常。