Golang 基于libpcap/winpcap的底层网络编程——gopacket安装
Go简介
Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。
语法类似C/C++,但是又带有一点python的味道
其中个人认为最出色的特点就是他的包管理,你可以在GoDoc、Go Search上找到非常多有用的包以及文档
同时只需执行 go get path ( e.g. go get https://godoc.org/github.com/google/gopacket)就可以将包下载到本地
gopacket简介
gopacket是google实现的一个基于libpcap的包,可以在GoDoc上找到该包的相关文档
它包含许多子包,提供了丰富的函数库,通过导入gopacket就可以使用libpcap提供的大多数API
gopacket安装
虽然gopacket是基于libpcap实现的,但是安装winpcap同样适用
不过不管选择libpcap还是winpcap,在使用都需要先进行相应的安装到本地(笔者安装的是winpcap)
首先,通过go get https://godoc.org/github.com/google/gopacket,该命令会将其下载到GOPATH (e.g. E:/GoWorkspace)
但在正式使用它进行开发之前还有几个注意事项:
编写代码test.go
//测试gopacket是否能够正常使用
package main
import (
"fmt"
_ "github.com/google/gopacket"
_ "github.com/google/gopacket/pcap"
)
func main() {
fmt.Println("It works!")
}
运行go run test.go,若成功输出,那么请跳过后文,开始你的gopacket之旅吧!
但可能会出现如下错误
# github.com/google/gopacket/pcap
E:\GoWorkspace\src\github.com\google\gopacket\pcap\pcap.go:21:10: fatal error: pcap.h: No such file or directory
#include <pcap.h>
^~~~~~~~
compilation terminated.
笔者也遇到了这个错误,google了很久并没有找到任何有用的解决方案,之后看了gopacket源码才解决
究其原因就是在于github.com/google/gopacket/pcap/pcap.go这个文件
//截取pcap.go的11-21行如下
#cgo solaris LDFLAGS: -L /opt/local/lib -lpcap
#cgo linux LDFLAGS: -lpcap
#cgo dragonfly LDFLAGS: -lpcap
#cgo freebsd LDFLAGS: -lpcap
#cgo openbsd LDFLAGS: -lpcap
#cgo darwin LDFLAGS: -lpcap
#cgo windows CFLAGS: -I C:/WpdPack/Include //问题出在 17-19行
#cgo windows,386 LDFLAGS: -L C:/WpdPack/Lib -lwpcap
#cgo windows,amd64 LDFLAGS: -L C:/WpdPack/Lib/x64 -lwpcap
#include <stdlib.h>
#include <pcap.h>
由于pcap.go中写了一个C的wrapper,但是写死了libpcap/winpcap的安装路径 pcap.go:L17-19 ,所以如果安装位置并非默认则会报上述错误
解决方案:
- 卸载并重新安装libpcap/winpcap到默认位置
- 修改github.com/google/gopacket/pcap/pcap.go文件
前者太过繁琐,笔者选择后者,将pcap.go 17-19行的三个路径改为对应的安装路径即可
转载请注明出处:http://www.cnblogs.com/tr3e/p/7137089.html
Golang 基于libpcap/winpcap的底层网络编程——gopacket安装的更多相关文章
- GitHub的实现是否是基于此语言的支持网络编程性呢?
我觉好像是的,我之前很奇怪为什么那样就可以引用了,后来发现GitHub中的java JavaScript phton等语言都支持网络编程.
- 读书笔记——网络编程与开发技术(3)基于TCP/IP协议的网络编程相关知识
TCP/IP协议:数据链路层,网络层,传输层,应用层. IP地址分为5类:A类.B类.C类.D类.E类. (A类.B类.C类是基本类,D类多用于多播传送,E类为保留类.) "*"表 ...
- 基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)
首先编写我们服务器上需要的c文件WebServer.c 涉及到的函数API: int copy(FILE *read_f, FILE * write_f) ----- 文件内容复制的方法 int Do ...
- 流式套接字:基于TCP协议的Socket网络编程(案例3)
案例:在案例1的基础上将传输的字符串换成具体的对象. 客户端代码: package com.yh.SocketObject; import java.io.IOException; import ja ...
- 流式套接字:基于TCP协议的Socket网络编程(案例2)
案例:在案例1的基础上实现一个服务器对应多个客户端(多线程),且获得每个客户端的IP. 线程代码: package com.yh.mySocket; import java.io.BufferedRe ...
- 数据包式套接字:基于UDP协议的Socket网络编程
步骤: 1.利用DatagramPacket封装数据包: 2.利用DatagramSocket发送数据包: 3.利用DatagramSocket接收数据包: 4.利用DatagramPacket处理数 ...
- 基于TCP/IP协议的C++网络编程(API函数版)
源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ...
- 基于Socket的低层次Java网络编程
Socket通讯 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流 ...
- 初识Socket通信:基于TCP和UDP协议学习网络编程
学习笔记: 1.基于TCP协议的Socket网络编程: (1)Socket类构造方法:在客户端和服务器端建立连接 Socket s = new Socket(hostName,port);以主机名和端 ...
随机推荐
- [原创]使用logcat快速抓取android崩溃日志
在android APP测试过程中会发生不少的crash,目前抓取日志的主流方法是通过eclipse或者eclipse的ddms组件进行捕抓,这两种方法有个缺点是启动时非常耗时.本文通过adb程序与b ...
- html打造动画【系列1】- 萌萌的大白
每个人心中都有一个暖暖的大白,blingbling的大眼睛~软软的肚子~宽厚的肩膀~善良的心肠~如果可以,我愿意沦陷在大白的肚子里永远不出来,哈哈~毛球要失宠咯~ 哈哈哈 每个人都是独立的个体,大白也 ...
- hibernate配置三步走
1.导入有hibernate的required和jpa的jar包,数据库驱动jar包,日志jar包 2.创建实体类,必须有一个属性有唯一的值 package com.hui.hibernate; pu ...
- 【原】vue单文件组件互相通讯
在vue中,我们可以把一个页面各个部分单独封装起来,做成各种小组件,然后加载,这样的好处是代码维护起来比较容易,重复的代码多处调用! 在一个vue项目中,单文件组件以.vue形式文件命名 每个组件之间 ...
- springMVC 配置和使用
springMVC相对于Struts2学习难度较为简单,并且更加灵活轻便. 第一步:导入jar包 spring.jar.spring-webmvc.jar.commons-logging.jar.sp ...
- 如何解决wamp中数据库读取数据是???的情况?
数据库中数据正常,但是从数据库读取出的数据在网页中显示时是???,该怎么办呢? 左键点击托盘区的WampServer图标,选择Mysql--my.ini,就会打开配置文件 1.在[client]段落增 ...
- Python爬虫从入门到放弃(十)之 关于深度优先和广度优先
网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据 ...
- Python将数据插入到数据库时遇到单引号插入错误的问题
这才是真正的解决方法,真不知道有些人连试都没试过就乱转载 比如你要插入一个字符串,是一个变量 如:str = "I'am a handsom boy" 由于这个字符串包含',插入数 ...
- 如何连接新浪sae共享数据库
网上找了很久,太杂了,下文介绍如何连接新浪sae共享数据库,方便有效 1.首先贴出官方文档: 以下是一些和共享MySQL数据库服务相关的预定义常量,你可以直接引用这些参数来连接数据库: 用户名 : S ...
- 使用CodeDOM动态编译一个字符串表达式
由于程序需要,计算的表达式使用字符串传输,这样对运算造成了影响.在程序中直接执行这段表达式可以得到值, 但是使用字符串就没有办法运算了, 所以想到用CodeDOM将这段字符串拼接在代码中编译 类似st ...