天道酬勤,学无止境

nfq_get_payload 如何构造它的返回数据?(How does nfq_get_payload structure its return data?)

问题

首先,我试图从 Netfilter 队列负载的负载中获取源地址和目标端口(负载是使用 nfq_get_payload 函数检索的)。 以下问题提出了同样的问题并得到了正确答案:

如何从iptables队列中的数据包中提取源端口号和目标端口号

不幸的是,没有解释为什么在地址中添加 20 和 22 会让您处于阅读信息的正确位置。 我认为这是因为数据的结构(显然),但如果有一个定义的结构,它是什么?

该文档没有明确解释数据的格式,只有“此函数检索的数据类型将取决于使用 nfq_set_mode() 函数设置的模式”,但是 set_mode 的文档没有提及任何有关数据的内容输入并且来源不会立即显示任何内容。

我觉得这一定是我遗漏或不理解的常见网络编程结构的核心内容。

注:nfq_get_payload 函数:http://www.netfilter.org/projects/libnetfilter_queue/doxygen/group__Parsing.html#gaf79628558c94630e25dbfcbde09f2933

回答1

我设法弄清楚了这一点,我将把它留在这里供其他人找到。

负载以 iphdr 结构开头。 iphdr 结构有一个协议字段,例如 tcp,如果它是 tcp,那么 iphdr 结构之后的数据是一个 tcphdr 结构,如果它是 udp,那么还有另一个 struct hdr 用于 icmp 等。

要访问端口,假设 q_data 是一个指向 nfq_data 结构的指针:

unsigned char *data;
nfq_get_payload(q_data, (unsigned char**)&data);
struct iphdr * ip_info = (struct iphdr *)data;
if(ip_info->protocol == IPPROTO_TCP) {
    struct tcphdr * tcp_info = (struct tcphdr*)(data + sizeof(*ip_info));
    unsigned short dest_port = ntohs(tcp_info->dest);
} else if(ip_info->protocol == IPPROTO_UDP) {
    //etc etc
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How does nfq_get_payload structure its return data?
    Primarily, I'm trying to get the source address and dest port from the payload of a Netfilter queue payload (The payload is retrieved using the nfq_get_payload function). The following question asks the same thing and gets a correct answer: How to extract source and destination port number from packet in queue of iptables Unfortunately, there's no explanation as to why adding 20 and 22 to the address puts you in the right spot to read the info. I assume this is because of the structure of the data (obviously), but if there's a defined structure, what is it? The documentation doesn't explicitly
  • forwarding packets to service in same host without using loopback network
    I have this libnetfilter_queue application which receives packets from kernel based on some iptables rule. Before going straight to my problem, i'm giving a sample workable code and other tools to set up a test environment so that We problem definition and possible solutions can be more accurate and robust. The following code describes the core functionality of the application: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <linux/types.h> #include <linux/netfilter.h> /* for NF_ACCEPT */ #include <errno.h> #include <libnetfilter_queue/libnetfilter
  • 调用堆栈的工作原理是什么?(How exactly does the callstack work?)
    问题 我试图更深入地了解编程语言的低级操作是如何工作的,尤其是它们如何与OS / CPU交互。 我可能已经在Stack Overflow上的每个与堆栈/堆相关的线程中阅读了每个答案,它们都很出色。 但是还有一件事我还没有完全理解。 在伪代码中考虑此函数,它通常是有效的Rust代码;-) fn foo() { let a = 1; let b = 2; let c = 3; let d = 4; // line X doSomething(a, b); doAnotherThing(c, d); } 这就是我假设堆栈看起来像第X行的样子: Stack a +-------------+ | 1 | b +-------------+ | 2 | c +-------------+ | 3 | d +-------------+ | 4 | +-------------+ 现在,我所读到的有关堆栈如何工作的所有内容都是严格遵守LIFO规则(后进先出)。 就像.NET,Java或任何其他编程语言中的堆栈数据类型一样。 但是如果是这样,那么在X行之后会发生什么? 因为显然,接下来我们需要使用a和b ,但这意味着OS / CPU(?)必须首先弹出d和c才能返回到a和b 。 但随后它会自行射击,因为在下一行中需要c和d 。 那么,我想知道幕后到底发生了什么? 另一个相关的问题。 考虑一下
  • 是否有与Perl的Data :: Dumper等效的Python用于检查数据结构?(Is there a Python equivalent to Perl's Data::Dumper for inspecting data structures?)
    问题 是否存在可以与Perl的Data :: Dumper模块相同的方式使用的Python模块? 编辑:对不起,我应该更清楚了。 我主要是在一个用于检查数据而不是持久化的模块之后。 顺便说一句谢谢您的回答。 这是一个很棒的网站! 回答1 Data :: Dumper有两个主要用途:数据持久性和调试/检查对象。 据我所知,没有什么能与Data :: Dumper完全一样的工作。 我使用pickle进行数据持久化。 我使用pprint直观地检查我的对象/调试。 回答2 我认为最接近的是pprint模块。 >>> l = [1, 2, 3, 4] >>> l.append(l) >>> d = {1: l, 2: 'this is a string'} >>> print d {1: [1, 2, 3, 4, [...]], 2: 'this is a string'} >>> pprint.pprint(d) {1: [1, 2, 3, 4, <Recursion on list with id=47898714920216>], 2: 'this is a string'} 回答3 可能有两种选择:泡菜,元帅,搁置。 回答4 我也已经使用Data :: Dumper相当一段时间了,并且已经习惯了显示格式良好的复杂数据结构的方式。 上面提到的pprint做得不错
  • 如何将参数传递给 ssis 中的 ado.net 源?(how to pass parameters to an ado.net source in ssis?)
    问题 这是原始查询,使用ado.net源和使用源中指定的 .net providers\odbc 数据提供者可以正常工作。 SELECT a.FA_CLNT_ID, a.FA_ACCT_NM, a.ACCT_E_DT, a.POL_PER_CURR_DT, a.POL_PER_NEXT_DT, a.FA_ACCT_NUM, a.GRP_SALES_OFFC_CD, a.ACCT_C_DT FROM gyv2M.DDM_ACCT_STRUC a INNER JOIN (SELECT max(DDM_ACCT_STRUC_TP) as DDM_ACCT_STRUC_TP, FA_CLNT_ID FROM gyv2M.DDM_ACCT_STRUC WHERE FA_DM_ROW_DT <= '6/30/2011' AND DM_ROW_E_DT <= '6/30/2011' GROUP BY FA_CLNT_ID) b ON a.DDM_ACCT_STRUC_TP = b.DDM_ACCT_STRUC_TP AND a.FA_CLNT_ID = b.FA_CLNT_ID AND FA_DM_ROW_DT <= '6/30/2011' AND a.DM_ROW_E_DT <= '6/30/2011' 但我需要使其自动化,以便从 sql server 中的表中获取值。
  • struc2vec介绍
    struc2vec 更多内容查看 https://github.com/tower111/Nure-network/blob/master/struc2vec/struc2vec.md 说明 本文从官方提供的 ppt 出发,主要是进行一些介绍,并不涉及复杂公式的讲解,详细的公式讲解见底部的参考文章。 Node Representations 将网络节点映射到另一个空间中,这个空间叫欧式空间(Euclidean space) 这里介绍了三种不同方式 第一个保留网络距离:所谓的距离是一个节点到另一个节点需要经过几个节点(分层)第三个根据节点度的不同进行分类 Structural Identity(结构性身份) 节点是什么。节点识别方法 上图描述了强结构化等价(Automorphism)和结构相似 。想要实现的是在欧式空间里面(类似于图一的表)表示这种相似和等价关系 相关工作 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 Word2vec:嵌入词(词来自句子中)到欧式空间deapwalk:嵌入网络节点通过随机游走产生句子(个人理解:所谓的句子是一个节点序列,这个序列由从开始节点到结束节点走过的一些序列组成,所谓随机是每次遇到分叉路口随机选择)node2vec:使用有偏见的随机行走生成句子。(控制随机游走的随机部分)关键点:deapwalk
  • sizeof(某些指针)是否始终等于4?(Is the sizeof(some pointer) always equal to four?)
    问题 例如: sizeof(char*)返回int* , long long*我尝试过的所有方法。 有什么例外吗? 回答1 您获得的保证是sizeof(char) == 1 。 没有其他保证,包括不能保证sizeof(int *) == sizeof(double *) 。 在实践中,指针在16位系统(如果可以找到)上的大小为2,在32位系统上为4,在64位系统上为8,但是依靠给定的值并没有任何好处。尺寸。 回答2 即使在普通的x86 32位平台上,您也可以获得各种指针大小,请尝试以下示例: struct A {}; struct B : virtual public A {}; struct C {}; struct D : public A, public C {}; int main() { cout << "A:" << sizeof(void (A::*)()) << endl; cout << "B:" << sizeof(void (B::*)()) << endl; cout << "D:" << sizeof(void (D::*)()) << endl; } 在Visual C ++ 2008下,对于成员函数指针,我得到4、12和8。 Raymond Chen在这里谈到了这一点。 回答3 已发布列表的另一个例外。 在32位平台上,指针可以占用6个字节
  • IDA逆向技巧之美
    IDA的逆向分析水平就是一个逆向工程师的水平; 7.1 IDA与OD的联合使用 一般使用OD下断点,找到关键代码位置,然后使用IDA静态看流程。 需要注意的是IDA需要与OD基地址对齐,这样才方便在IDA中查找代码位置,具体方式如下: Edit ---> Segment ----- Rebase Program : 设置基地址; 在WINdbg中基地址在“符号”中查看;在OD中基地址在Model中查看; IDA中G + 地址,即可找对对应位置; 7.2 数据不小心转换成为函数,如何处理? 如果不小心使用P将数据识别成了函数,可以使用D,转换成数据,再用C转换成为代码; 毕竟IDA不存在撤销功能; 7.3 IDA如何创建结构体? 7.3.1 结构体的创建 IDA中结构体成员一般出现在:类初始化的地方(XX.dll); 根据成员的多少,我们创建结构体的大小,注意虚表vt占4个字节;一般有三个地方有助于我们创建结构体:初始化函数成员列表、memcpy函数的使用、数据库字段; 在初始化函数中看见最后一个成员为V1[239],可以 使用“Reset Point Type” 可以改为:v1-> 1036,这样就能看到成员在的偏移,就可以设置结构体大小为1036 + 4.。 创建了结构体后,structure窗口中可以N改写字段的名称; 7.3.2 结构体的使用 创建好结构体后
  • 如何在Android中支持阿拉伯文字?(How to support Arabic text in Android?)
    问题 我正在从服务器成功获取阿拉伯文本。 检索的文本我想在代码中显示,但显示框而不是阿拉伯文本。 假设t数组的值是来自服务器的阿拉伯文本。 string[] t={" "}; Textview tv = (Textview) findviewByid(R.id.text); tv.setText(t[0]); 回答1 Android 2.1没有阿拉伯字体。 Android 2.2具有阿拉伯字体,但无法正确显示您的单词。 Android 3.x完全支持阿拉伯语。 对于Android 2.1,您必须设置字体Farsi.GetFarsiFont(this) ,然后使用Farsi.Convert("سلام") 对于Android 2.2,不需要设置字体,但必须使用Farsi.Convert("سلام") 对于Android 3.x,请忘记所有上述解决方案;)。 但是,如果您不喜欢3.x阿拉伯字体,则可以更改字体。 因此,请执行以下步骤: 1)首先在资产文件夹中添加“ TAHOMA.TTF” 2)使用以下类获取字体,并将您的阿拉伯语或波斯语文本转换为良好的形式,以便在您的活动中显示。 import android.content.Context; import android.graphics.Typeface; public final class Farsi { public
  • 如何在Android中支持阿拉伯文字?(How to support Arabic text in Android?)
    问题 我正在从服务器成功获取阿拉伯文本。 检索的文本我想在代码中显示,但是显示框而不是阿拉伯文本。 假设t数组的值是来自服务器的阿拉伯文本。 string[] t={" "}; Textview tv = (Textview) findviewByid(R.id.text); tv.setText(t[0]); 回答1 Android 2.1没有阿拉伯字体。 Android 2.2具有阿拉伯字体,但无法正确显示您的单词。 Android 3.x完全支持阿拉伯语。 对于Android 2.1,您必须设置字体Farsi.GetFarsiFont(this) ,然后使用Farsi.Convert("سلام") 对于Android 2.2,不需要设置字体,但必须使用Farsi.Convert("سلام") 对于Android 3.x,请忘记所有上述解决方案;)。 但是,如果您不喜欢3.x阿拉伯字体,则可以更改字体。 因此,请执行以下步骤: 1)首先在资产文件夹中添加“ TAHOMA.TTF” 2)使用以下类获取字体,并将您的阿拉伯语或波斯语文本转换为良好的形式,以便在您的活动中显示。 import android.content.Context; import android.graphics.Typeface; public final class Farsi { public
  • 与构造签名的接口如何工作?(How does interfaces with construct signatures work?)
    问题 我在解决如何在接口中定义构造函数的过程中遇到了一些麻烦。 我可能完全误会了一些东西。 但是我已经搜索了很长一段时间的答案,但找不到与此相关的任何内容。 如何在TypeScript类中实现以下接口: interface MyInterface { new ( ... ) : MyInterface; } Anders Hejlsberg创建了一个界面,其中包含与此视频类似的内容(大约14分钟)。 但是对于我的一生,我无法在课堂上实现这一点。 我可能误会了什么,我没有得到什么? 编辑: 澄清。 “新(...)”的意思是“任何东西”。 我的问题是,我什至无法获得此工作的最基本版本: interface MyInterface { new () : MyInterface; } class test implements MyInterface { constructor () { } } 这不是为我编译的消息,在尝试编译时,我得到“类'test'声明接口'MyInterface'但未实现”:类型'MyInterface'需要构造签名,但类型'test'缺少构造签名。 编辑: 因此,在研究了这一点之后,给出了更多反馈。 interface MyInterface { new () : MyInterface; } class test implements MyInterface {
  • Go初窥之 struc to Json
    学编程,就是在一堆所想非所得的实践中,把坑踩烂,最终学会技能。 刚装完goland,就遇到一个小白问题,怎么敲出来的hello world莫法执行。 几经波折,搜了几个网页,才发现,还是要装sdk的。 下载完sdk,安装好之后,再运行,这个坑就顺利趟过去了。 接着,仅仅是编译器内部输出文字,远远满足不了我学go的初衷。 一定要能通过浏览器输入接口,返回数据才行。 简而言之,就是web服务。 首先是string,顺利无坑。 接着是struct转json输出。这里,就出现了一个巨大的坑。 struct定义,本身没有特别要求命名规则,Goland检测代码也没有任何问题。 但是转换结果,一直都是惹人讨厌的{},左思右想,冥思苦想,都没弄明白得罪了谁。。 本着首先自己尝试,然后再百度的心态,也可以说是执念吧。 然后就痛苦的挣扎了半天,最终忍受不了度娘的诱惑。 在度娘温柔的指导下,最终恍然大悟,他么是因为结构中的变量,首字母必须大写,外部才能访问。 否则,marshal转换也成功了,但结果就是白板。 敲黑板:首字母大写=public, 首字母小写=private。 这个坑,踩得很实在,很没脾气,也记忆深刻,估计后续写struc,一定会不管21,先首字母大写再说。 忽然发现,想仗着自己那点微薄的经验,举一反三,是低估了go的鲜明个性。 总的来说,基础知识还没看完,革命还需深入进行,落实到细处实处
  • 保证复制清除如何工作?(How does guaranteed copy elision work?)
    问题 在2016年Oulu ISO C ++标准会议上,标准委员会将一项名为“通过简化的值类别进行保证的复制省略”的提案投票选为C ++ 17。 保证复制清除功能如何工作? 它是否涵盖了已经允许使用复制省略的某些情况,或者是否需要更改代码以保证复制清除? 回答1 在许多情况下都允许进行复制省略。 但是,即使允许,该代码仍然必须能够像不删除副本一样工作。 即,必须有一个可访问的副本和/或移动构造函数。 保证复制省略重新定义了一些C ++的概念,例如,某些情况下在那里拷贝/移动可能被省略不竟招来在所有复制/移动。 编译器不会保留副本;它不会保留副本。 该标准说,永远不会发生这样的复制。 考虑以下功能: T Func() {return T();} 在无保证的复制省略规则下,这将创建一个临时变量,然后从该临时变量移至函数的返回值。 此举操作可以被省略,但T还必须有即使从未使用过它的访问移动构造函数。 相似地: T t = Func(); 这是t副本初始化。 这将使用Func的返回值复制初始化t 。 但是,即使不被调用, T仍然必须具有move构造函数。 保证复制省略重新定义了prvalue表达式的含义。 在C ++ 17之前,prvalue是临时对象。 在C ++ 17中,prvalue表达式仅仅是可以实现临时的东西,但还不是临时的。 如果使用prvalue初始化prvalue类型的对象
  • Rust如何提供移动语义?(How does Rust provide move semantics?)
    问题 Rust语言网站声称移动语义是该语言的特征之一。 但是我看不到如何在Rust中实现移动语义。 锈盒是唯一使用移动语义的地方。 let x = Box::new(5); let y: Box<i32> = x; // x is 'moved' 上面的Rust代码可以用C ++编写为 auto x = std::make_unique<int>(); auto y = std::move(x); // Note the explicit move 据我所知(如果我错了,请纠正我), Rust根本没有构造函数,更不用说移动构造函数了。 不支持右值引用。 无法使用rvalue参数创建函数重载。 Rust如何提供移动语义? 回答1 我认为,使用C ++时这是一个非常普遍的问题。 在C ++中,当涉及到复制和移动时,您将明确地做所有事情。 该语言是围绕复制和引用而设计的。 使用C ++ 11,可以将“移动”内容的功能粘贴到该系统上。 另一方面,Rust重新开始。 Rust根本没有构造函数,更不用说移动构造函数了。 您不需要移动构造函数。 Rust移动了所有“没有复制构造函数”,也就是“没有实现Copy trait”的东西。 struct A; fn test() { let a = A; let b = a; let c = a; // error, a is moved }
  • Haskell中“ Just”语法的含义是什么?(What does the “Just” syntax mean in Haskell?)
    问题 我在互联网上搜寻了此关键字的实际解释。 我看过的每个Haskell教程都只是随机使用它,而从不解释它的作用(并且我看过很多)。 这是Real World Haskell的使用Just的基本代码。 我了解代码的功能,但我不了解Just的目的或功能是什么。 lend amount balance = let reserve = 100 newBalance = balance - amount in if balance < reserve then Nothing else Just newBalance 从我观察到的结果来看,它与Maybe打字有关,但这几乎是我所学的。 很好地解释了Just含义。 回答1 实际上,它只是在Prelude中定义的普通数据构造函数, Prelude是自动导入到每个模块中的标准库。 在结构上可能是什么 定义看起来像这样: data Maybe a = Just a | Nothing 该声明定义了一个类型( Maybe a ,该类型由类型变量a参数化,这仅意味着您可以将其与任何类型一起使用来代替a 。 构造与破坏 该类型具有两个构造函数, Just a和Nothing 。 当一个类型具有多个构造函数时,这意味着该类型的值必须仅使用一种可能的构造函数进行构造。 对于这种类型,值是通过Just或Nothing构造的,没有其他(非错误)可能性。
  • C# async/await 如何与更通用的构造相关,例如 F# 工作流或 monad?(How does C# async/await relates to more general constructs, e.g. F# workflows or monads?)
    问题 C# 语言设计一直(历史上)面向解决特定问题,而不是解决潜在的一般问题:例如参见 http://blogs.msdn.com/b/ericlippert/archive/2009/07/09/ iterator-blocks-part-one.aspx 用于“IEnumerable vs. coroutines”: 我们可以让它更通用。 我们的迭代器块可以被视为一种弱协程。 我们本可以选择实现完整的协程,并让迭代器块成为协程的一个特例。 当然,协程又不如一流的延续那么通用。 我们可以实现延续,在延续方面实现协程,在协程方面实现迭代器。 或 http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx 用于 SelectMany 作为(某种)Monads 的代理: C# 类型系统不够强大,无法为 monad 创建通用抽象,这是创建扩展方法和“查询模式”的主要动力 我不想问为什么会这样(已经给出了许多好的答案,尤其是在 Eric 的博客中,这可能适用于所有这些设计决策:从性能到增加的复杂性,对于编译器和程序员而言)。 我想了解的是 async/await 关键字与哪个“一般构造”相关(我最好的猜测是延续 monad - 毕竟,F# async 是使用工作流实现的,据我所知,这是一个延续
  • 设计模式:仅在需要时如何创建数据库对象/连接?(Design Patterns: How to create database object/connection only when needed?)
    问题 我有一个简单的应用程序,说它有一些类和一个“额外的”类来处理数据库请求。 当前,每次使用该应用程序时,我都会创建数据库对象,但是在某些情况下,不需要数据库连接。 我正在这样做(PHP btw): $db = new Database(); $foo = new Foo($db); // passing the db 但是有时$foo对象不需要数据库访问,因为仅调用没有数据库操作的方法。 所以我的问题是:处理这样的情况的专业方法是什么/如何仅在需要时才创建数据库连接/对象? 我的目标是避免不必要的数据库连接。 回答1 注意:尽管可以直接回答ops问题:“何时只能在需要时创建/连接到数据库,而不是在每个请求时都可以连接到数据库”,但这是在需要时注入的,只是说这没有帮助。 我在这里解释的是您实际上是如何正确处理的,因为在非特定框架的上下文中确实没有很多有用的信息可以帮助您解决此问题。 更新:此问题的“旧”答案可以在下面看到。 这鼓励了非常有争议的服务定位器模式,并且对许多“反模式”而言。 新的答案加上了我从研究中学到的知识。 请先阅读旧答案,看看进展如何。 新答案 在使用粉刺一段时间后,我学到了很多有关粉刺的知识,以及它实际上并不那么神奇。 它仍然很酷,但是之所以只有80行代码,是因为它基本上允许创建闭包数组。 Pimple经常用作服务定位器(因为它实际上只能做些限制),这是一种
  • 如何实现打字稿装饰器?(How to implement a typescript decorator?)
    问题 TypeScript 1.5现在具有装饰器。 有人可以提供一个简单的示例,演示实现装饰器的正确方法并描述可能的有效装饰器签名中的参数是什么意思吗? declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void; declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void; declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void; declare type ParameterDecorator = (target: Function, propertyKey: string | symbol, parameterIndex: number) => void; 此外,在实现装饰器时是否应牢记最佳实践考虑因素? 回答1 我最终与装饰师一起玩耍,并决定将我想出的内容记录下来
  • Haskell类型与数据构造器(Haskell Type vs Data Constructor)
    问题 我正在从learningyouahaskell.com学习Haskell。 我在理解类型构造函数和数据构造函数时遇到麻烦。 例如,我不太了解两者之间的区别: data Car = Car { company :: String , model :: String , year :: Int } deriving (Show) 和这个: data Car a b c = Car { company :: a , model :: b , year :: c } deriving (Show) 我知道,第一种方法是简单地使用一个构造函数( Car )来构建Car类型的数据。 我不太明白第二个。 另外,如何定义数据类型,如下所示: data Color = Blue | Green | Red 适合所有这些吗? 据我了解,第三个示例( Color )是一种可以处于三种状态的类型: Blue , Green或Red 。 但这与我理解前两个示例的方式相矛盾: Car类型只能处于一种状态Car ,可以采用各种参数进行构建吗? 如果是这样,第二个示例如何适合? 本质上,我正在寻找一种解释,以统一以上三个代码示例/构造。 回答1 在data声明中,类型构造函数是等号左侧的内容。 数据构造函数是等号右侧的内容。 您可以在需要类型的地方使用类型构造函数,并在需要值的地方使用数据构造函数。
  • 嵌入式软件工程师笔试面试指南-C/C++
    哈喽,大家好。最近几天,我把去年秋招总结的笔试面试的一些内容,又进行了重新规划分类。详细分成了简历书写,面试技巧,面经总结,笔试面试八股文总结等四个部分。其中,八股文又分成了C/C++,数据结构与算法分析,Arm体系与架构,Linux驱动开发,操作系统,网络编程,名企笔试真题等七个部分。本次八股文更新,对于部分不合适的内容进行了删减,新增了C++相关内容。以上七个部分的内容,会同步更新在github,链接https://github.com/ZhongYi-LinuxDriverDev/EmbeddedSoftwareEngineerInterview 。希望大家能给个star支持下,让我有继续更新下去的动力。所有内容更新完成后,会将这些内容整合成PDF。话不多说,看下目录。预警:本文内容很长,很长,很长!没耐心看完的建议直接跳转github,获取PDF下载方式。C/C++关键字C语言宏中"#“和”##"的用法(#)字符串化操作符作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。如:#define example( instr ) printf( "the input string is:\t%s\n", #instr )#define example1( instr ) #instr当使用该宏定义时