簡體   English   中英

傳輸層協議的原始套接字

[英]Raw socket for transport layer protocol

我想做的是用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

對於那些正在搜索的人,這是我找到的解決方案: http : //www.pdbuchan.com/rawsock/rawsock.html

在上述頁面的文件tcp4.c中,有一個使用原始套接字的客戶端實現。 該代碼同時添加了IP和TCP標頭,但是您可以簡單地刪除添加TCP標頭的行,並用自己的協議替換它們。 您還需要更改此行: iphdr.ip_p = IPPROTO_TCPiphdr.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM