2012-04-12 10 views
5

Vorrei scrivere un programma ed eseguirlo su due macchine e inviare alcuni dati da una macchina all'altra in una cornice Ethernet.Posso scrivere programmi di rete basati su Ethernet in C++?

In genere i dati dell'applicazione sono al livello 7 del modello OSI, c'è qualcosa come una restrizione del kernel o una restrizione API, che mi impediscono di scrivere un programma in cui posso specificare un indirizzo MAC di destinazione e avere alcuni dati inviati a quel MAC come payload Ethernet? Quindi scrivere un programma per ascoltare i frame in arrivo e afferrare i frame da un indirizzo MAC di origine specificato, estraendo il carico utile dei dati dal frame?

(Quindi non voglio nessun altro overhead come IP o intestazioni TCP/UDP, non voglio andare più in alto del layer 2).

Questo può essere fatto in C++, o tutte le comunicazioni avvengono al livello IP e ciò può essere fatto su Ubuntu? Amore extra per indicare o fornire esempi! : D

Il mio problema è, ovviamente, io sono nuovo alla rete di programmazione in C++ e per quanto ne so, se voglio comunicare attraverso una rete devo usare una chiamata socket() o simili, che funziona ad un livello IP , quindi posso scrivere un programma C++ per lavorare su OSI layer 2, ci sono API per questo, il kernel di Linux permette anche questo?

+1

C++ è un linguaggio di programmazione, IP Layer è un concetto astratto. Come si sostituisce l'altro nel tuo testo è oltre me. – littleadv

+5

@littleadv: Perché? Non sa esattamente cosa chiedere ("Come uso i socket grezzi in C++?"), Ma puoi capire perfettamente il significato. – cha0site

+3

In teoria, non ci dovrebbero essere problemi con il C++ che passerà ai successivi 2, ma il supporto del sistema operativo potrebbe limitarti. Anche se l'UDP ha pochissimo overhead, basta usare quello. –

risposta

7

Come già accennato prese, probabilmente vorrei solo usare un raw socket. Forse questo page with C example code è di qualche aiuto.


Nel caso in cui siete alla ricerca di un'idea per un programma solo tramite Ethernet, pur essendo utile:

Wake on LAN nella sua forma originale è abbastanza semplice. Si noti tuttavia che la maggior parte delle attuali implementazioni in realtà inviano pacchetti UDP (sfruttando che il ricevitore non analizza le intestazioni dei pacchetti ecc. Ma solo una stringa nel payload del pacchetto).


Inoltre, l'utilizzo di socket non elaborati è generalmente limitato agli utenti con privilegi. Potrebbe essere necessario sia

  • chiamare il programma come root
  • o lo hanno proprietà di root e bit setuid impostato
  • o impostare la funzionalità per la creazione di raw socket utilizzando setcap CAP_NET_RAW+ep /path/to/your/program-file

L'ultima opzione offre più privilegi a grana fine (solo socket grezzi, non accesso in scrittura all'intero file system, ecc.) rispetto agli altri due. Tuttavia è ancora meno noto, dato che è "solo" supportato dal kernel 2.6.24 in poi (fornito con Ubuntu 8.04).

+0

Grazie per il tuo input e link per esempi di codice. Questo ha chiarito molte cose per me :) – jwbensley

+0

Contento di poter aiutare :) – zpea