Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 原始套接字linux_C_Linux_Sockets_Tcp - Fatal编程技术网

C 原始套接字linux

C 原始套接字linux,c,linux,sockets,tcp,C,Linux,Sockets,Tcp,也许这个问题有点愚蠢,但我会问的。我读了很多关于网络中原始套接字的文章,已经看到了几个例子。因此,基本上,使用原始套接字可以构建自己的头堆栈,比如stack=IP+TCP/UDP+own_头。我的问题是,是否可以从linux内核中获得前两个(IP+TCP/UDP)的某种就绪帧,然后将自己的头附加到它们?所讨论的操作系统是linux,语言是C 我找不到任何函数可以做这样的事情,但可能是我在错误的方向上挖掘。我会依赖现有的协议(即UDP尽最大努力,TCP可靠),并在其中封装我自己的头。实际上,这意味

也许这个问题有点愚蠢,但我会问的。我读了很多关于网络中原始套接字的文章,已经看到了几个例子。因此,基本上,使用原始套接字可以构建自己的头堆栈,比如stack=IP+TCP/UDP+own_头。我的问题是,是否可以从linux内核中获得前两个(IP+TCP/UDP)的某种就绪帧,然后将自己的头附加到它们?所讨论的操作系统是linux,语言是C


我找不到任何函数可以做这样的事情,但可能是我在错误的方向上挖掘。

我会依赖现有的协议(即UDP尽最大努力,TCP可靠),并在其中封装我自己的头。实际上,这意味着在标准UDP/TCP连接上嵌入您自己的协议。这样,您就可以使用现有的内核和用户级工具


如果你想用另一种方式(即UDP/TCP封装在你自己的头中),你必须在linux内核中设计/实现你自己的协议,这相当复杂。

我将依赖现有的协议(即UDP尽最大努力,TCP可靠),并将我自己的头封装在其中。实际上,这意味着在标准UDP/TCP连接上嵌入您自己的协议。这样,您就可以使用现有的内核和用户级工具


如果你想用另一种方式(即,UDP/TCP封装在你自己的头中),你必须在linux内核中设计/实现你自己的协议,这相当复杂。

不,这对于原始套接字是不可能的

您可以坐在TCP/UDP之上,在这种情况下,IP堆栈负责头和协议的操作(例如,在TCP的情况下,如何将数据分割成段)

所以,如果您想在TCP或UDP之上添加内容,这就是普通TCP或UDP套接字的用途


或者你坐在IP之上,在这种情况下,你有责任在IP之上制作你想要的任何东西——这就是原始套接字的用途。尽管在这种情况下,您也可以构造IP头,或者选择让IP堆栈也生成IP头。

否,这对于原始套接字是不可能的

您可以坐在TCP/UDP之上,在这种情况下,IP堆栈负责头和协议的操作(例如,在TCP的情况下,如何将数据分割成段)

所以,如果您想在TCP或UDP之上添加内容,这就是普通TCP或UDP套接字的用途


或者你坐在IP之上,在这种情况下,你有责任在IP之上制作你想要的任何东西——这就是原始套接字的用途。虽然在这种情况下,您也可以构造IP头,或者选择让IP堆栈也生成IP头。

我认为您不了解原始套接字的用途。使用原始套接字(s=套接字(AF_INET、SOCK_RAW、IPPROTO_RAW)),您必须自己构建物理层之上的所有内容

这意味着您要构建IP报头(当然,如果您想在IP之上构建您的协议),您可以在这里使用AF_数据包完成您自己的事情。如果您想要TCP,您可以自己构建TCP报头,并将其添加到IP报头。在大多数情况下,当您使用原始套接字时,这是您开始构建自己的协议来代替TCP或UDP的地方,否则为什么要首先使用原始套接字?例如,如果您想构建自己的ICMP或SCTP实现,您可以使用原始套接字

如果您真的想了解它是如何工作的,我建议您构建自己的“ping”版本(换句话说,ICMP echo请求实现)。这很容易做,也很容易测试,会迫使你的手有点脏


如果你问我的话,手册页很好地涵盖了整个主题。从套接字开始。

我认为您不理解原始套接字的用途。使用原始套接字(s=套接字(AF_INET、SOCK_RAW、IPPROTO_RAW)),您必须自己构建物理层之上的所有内容

这意味着您要构建IP报头(当然,如果您想在IP之上构建您的协议),您可以在这里使用AF_数据包完成您自己的事情。如果您想要TCP,您可以自己构建TCP报头,并将其添加到IP报头。在大多数情况下,当您使用原始套接字时,这是您开始构建自己的协议来代替TCP或UDP的地方,否则为什么要首先使用原始套接字?例如,如果您想构建自己的ICMP或SCTP实现,您可以使用原始套接字

如果您真的想了解它是如何工作的,我建议您构建自己的“ping”版本(换句话说,ICMP echo请求实现)。这很容易做,也很容易测试,会迫使你的手有点脏


如果你问我的话,手册页很好地涵盖了整个主题。从套接字开始。

如果您只想添加IP和TCP/UDP以上的内容,则不需要原始套接字,只需要普通TCP或UDP套接字。我不明白。如果你只想添加IP和TCP/UDP以上的内容,你不需要原始套接字,你只需要一个普通的TCP或UDP套接字。我不明白。是的,看起来,你是对的。我不明白,这是为了什么。我对这样的事情有点陌生,我只读了一个非常基本的文档。还得买一本史蒂文斯的unix网络编程第一卷书。是的,看来你是对的。我不明白,这是为了什么。我对这样的事情有点陌生,我只读了一个非常基本的文档。还得买一本史蒂文斯的unix网络编程第一卷书。