传输层协议的原始套接字

时间:2019-07-10 08:49:44

标签: sockets c++

我想做的是用C ++编写自己的传输层协议。我不知道如何创建一个原始套接字,该套接字可以自动解析IP标头,并由我自己来设置有效负载。

我设法使用

在服务器上接收数据包
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))

,但是没有设法创建一个可以将数据发送到服务器的客户端。 (我什至不知道上面的插座是L2还是L3)

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

socket(AF_INET, SOCK_RAW, protocol)

如果我的意图是创建自己的而不使用现有的协议,那么我不知道该协议要填写什么。 (我尝试了许多iana号码,包括143-252范围)

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

我现在所拥有的:

server.cpp:https://pastebin.com/yLMFLDmJ

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

1 个答案:

答案 0 :(得分:0)

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

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

因此,这是具有上述更改的精简版本,该版本发送仅包含IP标头的IP数据包:https://pastebin.com/z2sGmtQd

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