在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);
....
}
哪里行,
ip_hdr = (struct iphdr *)(buf + 14)
有char *
类型转换为 struct iphdr *
.
GO 作为一种类型安全的语言,不允许这样的类型转换。 Go 没有 void *
除了 interface
遵循结构类型
如何在 GO 中处理此类代码?
最佳答案
让我们换个角度来看这个问题:类型转换在 C 语言中有什么作用?
好吧,从某种意义上说,它什么也没做!它只是在内存中的某个点采用一些位模式,并盲目地假设这个特定的位模式实际上代表某种类型的值。但是没有对此进行验证,也没有进行任何解析。这就是问题所在。
但是,我已经使用了解决上述问题的词:解析。我们不是盲目地假设内存中的某个随机位模式与 C 编译器为某种类型的值生成的位模式相同,我们实际上查看位模式,检查它是否符合如何构造该数据类型的位模式的规则,并根据这些规则将位模式解构为其组成部分。
换句话说:我们编写一个解析器。
请注意,这并非特定于 Go。即使在 C 中也是一个好主意。事实上,您发布的代码至少有三种,也许四种不同的方式被破坏:
char
不是 8 位宽的平台- 对齐
- 填充
- 字节顺序
据我所知,已经有现成的用 Go 编写的 IP、UDP 和 TCP 解析器,您可以使用或学习它们。此外,Alan Kay 的 Viewpoints Research Institute 的当前系统有一个非常酷的 TCP/IP 堆栈,仅用 120 行左右编写,非常易于阅读。 (事实上 ,解析器的源代码实际上只是由从 RFC 剪切和粘贴的 ASCII 图组成。)
关于c - 类型安全与松散类型 - GO 与 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42192207/