2017-09-16 7 views
0

J'ai joué récemment avec l'interface de socket sur linux et fenêtre pour envoyer des paquets TCP et UDP entre machines sur le même réseau . Habituellement, cela est fait avec une certaine structure de socket, avec des méthodes pour ouvrir, écrire des données, lire des données et le fermer quand c'est fait.Quel est le moyen le plus bas niveau pour envoyer des données à l'appareil/dev/eth0 (ou similaire) avec c/C++

Existe-t-il un moyen de le faire sans cette structure de socket? Je veux dire, si je l'utilise, cette structure prend les données que je lui passe, l'empaquette avec les en-têtes de protocole et envoie à travers le réseau. Est-ce que je peux utiliser quelque chose de similaire à cat file.txt > /dev/etho (ou /dev/wlp5s0 dans mon cas) mais en utilisant c/C++ pour envoyer les données à l'autre machine sur le réseau?

+1

Vous pouvez jeter un oeil à [raw sockets] (https://en.wikipedia.org/wiki/Raw_socket) ou [réseau espace utilisateur] (https://www.google.com/search?q=user + espace + mise en réseau). –

+0

@SteffenUllrich Je connaissais déjà les sockets raw, mais utilise toujours des sockets, non? Je vais jeter un oeil à ce réseau d'espace utilisateur. –

+0

* "mais utilise toujours des sockets" * - oui, c'est toujours un descripteur de fichier où vous pouvez lire et écrire aussi. Mais, en accédant '/ dev/eth0' comme vous le proposez, vous avez aussi un descripteur de fichier où vous pouvez lire et écrire. Seulement, vous avez maintenant non seulement la capacité de tout faire, mais vous devez aussi tout faire, y compris vous assurer qu'aucune autre application n'indique votre utilisation directe de la carte réseau. C'est ce que fait essentiellement le réseau de l'espace utilisateur: un processus (et un seul processus) a le contrôle total de la carte réseau au lieu que le noyau ait un contrôle total. –

Répondre

1

Vous ne pouvez pas ouvrir directement /dev/eth0, pour une raison qui peut être évident si vous avez essayé:

$ cat /dev/eth0 
cat: /dev/eth0: No such file or directory 

Les périphériques réseau sont tout simplement pas représentés dans le système de fichiers la façon dont d'autres périphériques (tels que les disques et série lignes) sont. Comme vous pouvez le constater dans les commentaires, vous pouvez utiliser des sockets raw. Les sockets raw vous permettent de faire exactement ce que vous voulez: envoyer des paquets qui sont complètement formés, que le noyau sortira tel quel, sans aucune modification (le déchargement de checksum TCP non-supporté). Si vous souhaitez avoir l'autre direction, c'est-à-dire - que le noyau traite votre descripteur de fichier comme s'il s'agit d'un périphérique réseau, vous pouvez utiliser l'interface tap/tun /dev/net/tun. Cela vous permet de créer une interface que le noyau traite comme s'il s'agissait d'un périphérique ethernet réel, que vous contrôlez ce qui est "reçu", et le noyau vous permet de savoir ce qu'il envoie.