[英]Implementing Raw Sockets in C vs Python
我一直在學習如何在 python 中使用原始套接字。
python 中的原始套接字可用於將任意二進制數據發送到任何特定接口,而無需任何其他詳細信息,例如 MAC 地址或 IP 地址。
例如,請考慮以下代碼:
import socket
sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
sock.bind(('lo',0))
sock.send('This is a sample Raw Socket Code'.encode())
sock.close()
當這個腳本以 root 用戶身份執行時,我們可以在 Wireshark(或任何嗅探器)的環回接口中捕獲一個數據包(因為我已將套接字綁定到 'lo'),其中包含上述文本的二進制字符串,僅此而已(當然,這是一個格式錯誤的數據包)。
問題是,我無法在 C 中找到這個用例的實現。我能找到的 C 中原始套接字的每個實現都處理某種地址。 sendto() 需要參數 (struct sockaddr*),它是 (struct sockaddr_ll*) 或 (struct sockaddr_in*) 的通用版本,最終需要一個地址。
我們如何在 C 中實現上述用例? 我知道我們可以立即使用 python 實現,因為它可用。 但我很想知道如何在 C 中實現。
您可以使用以下代碼
int send(int fd, int ifindex, const uint8_t* buf, size_t len) {
struct sockaddr_ll to;
struct sockaddr* to_ptr = (sockaddr*)&to;
to.sll_family = AF_PACKET;
to.sll_ifindex = ifindex;
to.sll_halen = 6;
memcpy(&to.sll_addr, buf, 6);
int ret = sendto(fd, buf, len, 0, to_ptr, sizeof(to));
return ret;
}
在哪里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.