簡體   English   中英

在 C 和 Python 中實現原始套接字

[英]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;
}

在哪里

  • fd - 套接字 ID
  • ifindex - 要用於發送的接口的 ifindex
  • buf - 是具有形成以太網幀的緩沖區
  • len - 緩沖區的長度

暫無
暫無

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

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