IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

RAW SOCKET et Ethernet


Sujet :

Réseau C

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Points : 72
    Points
    72
    Par défaut RAW SOCKET et Ethernet
    Bonjour,

    je me permets de venir poster une demande d'information car je bloque un peu. Depuis quelques jours je cherche sur internet comment créer un socket pour forger des paquets Ethernet. Le programme que je veux faire, je veux le rendre compatible sous Windows et GNU/Linux. Mais voilà je rencontre un problème au niveau de la création du socket.

    J'ai vu beaucoup de personnes demandé de l'aide pour pouvoir créer un paquet ARP et l'envoyer, à partir de Windows, et souvent la réponse donné est : pas possible, regarde du côté de WinpCap. Mais j'ai aussi vue quelques fois une réponse qui disait : Sous Windows on ne peut pas, de base, avec les sockets, créer un paquet Ethernet, mais si tu construits ton en-tête Ethernet, et avec les "raw socket" tu pourra.

    Donc j'ai créé mes structures représentants mes en-têtes, et quand je veux créer un socket je ne vois pas comment le configurer.

    int socket(int domain, int type, int protocol);

    Pour le type, j'ai compris que je devais faire un : SOCK_RAW

    Pour le domain .. Je ne vois pasce que je dois spécifier... Sous GNU/Linux j'ai vu qu'on pouvait mettre : PF_PACKET pour créer des paquets bas-niveau. Mais sous Windows je n'ai pas trouvé d'équivalent.

    Pour le protocol, pareil, je ne vois pas le quel spécifier, car dans la doc je ne vois que protocol lié à IP.

    Donc je ne vois pas trop comment créer mon socket.

    Si quelqu'un à des indices à me donner, une direction à prendre, je suis preneur.

    Merci,
    Cordialement,
    Reverse_

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Hello,

    je n'ai jamais cree de tel socket, mais la syntaxe pourrait etre socket(AF_INET, SOCK_RAW, IPPROTO_RAW);.
    Pour le protocol, tu peux passer 0 et il devrait deduire le bon des autres parametres.
    J'ai un bouquin au boulot avec plus d'infos, si jamais lundi t'es toujours bloque fais-le savoir
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Points : 72
    Points
    72
    Par défaut
    Merci pour ta réponse,
    mais j'avoue ne pas trop comprendre pourquoi pour le domain je dois mettre : AF_INET, alors que dans le man il est dit que c'est pour les protocoles Internet IPv4.

    Est-ce parce la transmission de ma trame Ethernet va se faire par le support du protocole IP ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour,

    La famille AF_INET permet d'utiliser des raw sockets avec SOCK_RAW tout en restant dans le domaine Internet, c'est-à-dire que le contenu de ton paquet sera quand même contenu à l'intérieur d'un paquet IP. Concrètement, dans cette famille, SOCK_STREAM est résolu en TCP, SOCK_DGRAM est résolu en UDP, tout en laissant le champ protocol à zéro pour laisser le système choisir le protocole le plus adapté dans sa catégorie. En IP, la question ne se pose pas parce qu'on n'utilise que deux protocoles de transports, mais il pourrait très bien y en avoir plus et, donc, plusieurs protocoles de type stream ou datagram disponibles.

    Dans ce cadre, SOCK_RAW te permet d'implémenter ton propre protocole au dessus d'IP, et le champ protocol va aller directement remplir le champ « protocol » homologue de l'entête IPv4 : https://tools.ietf.org/html/rfc791#section-3.1

    C'est utile par exemple pour implémenter en user space, à l'aide d'une bibliothèque ou d'un dæmon, les nouveaux protocoles qui n'étaient pas encore disponibles au moment du déploiement du système d'exploitation qui fait tourner le programme (c'est d'ailleurs exactement comme cela que c'est présenté dans la man page) ou pour pouvoir faire des raw sockets « partiels » sans avoir à tout réécrire depuis la base.

    Si c'est ARP qui t'intéresse, c'est ce qu'il te faut, mais il est préférable de demander au système d'exploitation de le faire via les services en place. Si tu travailles en IPv6, il vaut mieux se tourner vers NDP.

    Si tu veux vraiment forger un paquet au dessus d'Ethernet mais indépendamment de l'IP ou de tout autre protocole de transport, il faut descendre plus bas : AF_PACKET.

    Voir :
    • man 7 ip
    • man 7 ipv6
    • man 7 raw


    et

    • man 7 packet

    … pour les sockets de vraiment bas niveau (au niveau des paquets eux-mêmes).

  5. #5
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 76
    Points : 72
    Points
    72
    Par défaut
    Merci pour ces informations, ça confirme ce que j'avais un peu lu sur internet.
    Et justement mon soucis vient de AF_PACKET qui n'est pas implémenter sous windows, et je cherchais donc quel équivalent prendre.

    Merci,

Discussions similaires

  1. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  2. MsnP7 & Raw Sockets
    Par Deimos dans le forum C++
    Réponses: 4
    Dernier message: 16/01/2005, 17h40
  3. [C#] raw socket?
    Par Blo0d4x3 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/12/2004, 12h20
  4. Raw socket
    Par trax44 dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/11/2004, 18h26
  5. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo