我想做的是用 C++ 制作自己的传输层协议(protocol)。我不知道如何创建一个自动解析 IP header 的原始套接字,并让我来设置有效负载。

我设法使用服务器接收数据包

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)) 

但未能创建一个可以向服务器发送数据的客户端。 (我什至不确定上面的套接字是L2还是L3)

根据我对原始套接字的了解,L3 套接字看起来像

socket(AF_INET, SOCK_RAW, protocol) 

问题是,如果我的目的是创建自己的协议(protocol)而不是使用现有的协议(protocol),我不知道该填写什么内容。 (我已经尝试过许多 iana 号码,包括范围 143-252)

所以问题是:如何在互联网协议(protocol)之上创建服务器端和客户端的套接字,以便两台计算机可以以任意协议(protocol)进行通信(或相互发送数据)?换句话说,我想指定结束 IP 地址和有效负载,并让套接字处理 IP header 。

我现在拥有的:

服务器.cpp:https://pastebin.com/yLMFLDmJ

client.cpp: https://pastebin.com/LWuNdqPT

请您参考如下方法:

对于那些正在搜索的人,这是我找到的解决方案:http://www.pdbuchan.com/rawsock/rawsock.html

在上述页面的 tcp4.c 文件中,有一个使用原始套接字的客户端实现。该代码添加了 IP 和 TCP header ,但您可以简单地删除添加 TCP header 的行并将其替换为您自己的协议(protocol)。您还需要将此行:iphdr.ip_p = IPPROTO_TCP 更改为 iphdr.ip_p = 200(200 或 143-252 范围内的任何数字;请参阅 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)并设置您正在使用的接口(interface)的名称,以及更改地址。

因此,这是一个经过上述更改的精简版本,它发送仅包含 IP header 的 IP 数据包: https://pastebin.com/z2sGmtQd

这是一个非常简单的服务器,可以接收这些数据包:https://pastebin.com/jJgZUv5p


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!