在C中,以下是嗅探器代码,
void Handle_IP(char *buf)
{
struct iphdr *ip_hdr; // declaring pointer of type ip header
struct in_addr in; // declaring a structure which holds ip address
FILE *fp;
int ctl, len;
/* In the following statement we're adjusting the offset so that
ip pointer can point to correct location */
ip_hdr = (struct iphdr *)(buf + 14);
....
}
Run Code Online (Sandbox Code Playgroud)
哪条线,
ip_hdr = (struct iphdr *)(buf + 14)有char *类型铸造的struct iphdr *.
GO是一种类型安全的语言,不允许这种类型的转换.void *除了interface结构类型之外,Go没有
如何在GO中处理这样的代码?
让我们从不同的角度来看待这个问题:在C中做类型转换是做什么的?
嗯,从某种意义上说,它什么都不做!它只需要在内存中的某个点上采用一些位模式,并盲目地假设这个特定的位模式实际上代表了某种类型的值.但是没有对此进行验证,没有任何解析.这就是问题所在.
但是,我已经使用了上述问题的解决方案:解析.而不是盲目地假设内存中的某些随机位模式是C编译器为某种类型的值生成的相同位模式,我们实际上看一下位模式,检查它是否符合位模式的规则构造该数据类型,并根据这些规则将位模式解构为其组成部分.
换句话说:我们编写一个解析器.
请注意,这不是Go特有的.即使在C中也是一个好主意.实际上,您发布的代码至少有三种,也许是四种不同的方式:
char不是8位宽的平台AFAIK,已有现成的IP,UDP和TCP解析器,可以使用或学习.此外,来自Alan Kay的Viewpoints Research Institute的当前系统有一个非常酷的TCP/IP堆栈,只需120行左右,非常容易阅读.(实际上,解析器的源代码实际上只包含从RFC剪切并粘贴的ASCII图.)