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 :

sendto:Permission Denied (socket raw)


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut sendto:Permission Denied (socket raw)
    Bonjour,
    J'ai fait un programme utilisant un socket raw (je gère moi même les headers IP et TCP), tout se passe bien sauf au moment de l'execution. En effet, je suis loggué en root, mais j'ai tout de même un message d'erreur "Permission Denied" (perror) lors de l'utilisation de sendto(). J'ai utilisé setsockopt pour mettre l'option HDRINCL sur mon socket indiquant à mon OS de ne pas s'occuper des headers.

    Voilà le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <linux/ip.h>
    #include <linux/tcp.h>
     
    #define DATAGRAM_SIZE 4096
    #define PORT_DST 80
    #define PORT_SRC 1234
    #define IP_SRC 127.0.0.1
    #define IP_DST 213.246.63.35 
     
     
    unsigned short csum (unsigned short *buf, int nwords)
    {
    	unsigned long sum;
    	for (sum = 0; nwords > 0; nwords--)
    		sum += *buf++;
    	sum = (sum >> 16) + (sum & 0xffff);
    	sum += (sum >> 16);
    	return ~sum;
    }
     
    int main(void)
    {
    	char datagram[DATAGRAM_SIZE];
    	struct iphdr *iph = (struct iphdr *) datagram;
    	struct tcphdr *tcph = (struct tcphdr *) datagram + sizeof(struct iphdr);
    	struct sockaddr_in sain;
    	int sockfd = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
    	int on;
     
    	sain.sin_family = AF_INET;
    	sain.sin_port = htons(PORT_DST);
    	sain.sin_addr.s_addr = inet_addr("IP_DST");
    	memset(&(sain.sin_zero),0,8);
     
    	memset(datagram,0,DATAGRAM_SIZE);
    	iph->version = 4;
    	iph->ihl = 5;
    	iph->tos = 0;
    	iph->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
    	iph->id = htonl(8147);
    	iph->frag_off = 0;
    	iph->ttl = 255;
    	iph->protocol = 6;
    	iph->check = 0;
    	iph->saddr = inet_addr("IP_SRC");
    	iph->daddr = sain.sin_addr.s_addr;
    	tcph->source = htons(PORT_SRC);
    	tcph->dest = htons(PORT_DST);
    	tcph->seq = 0;
    	tcph->ack_seq = 0;
    	tcph->res1 = 0;
    	tcph->doff = 0;
    	tcph->fin = 0;
    	tcph->syn = 1;
    	tcph->rst = 0;
    	tcph->psh = 0;
    	tcph->ack = 0;
    	tcph->urg = 0;
    	tcph->ece = 0;
    	tcph->cwr = 0;
    	tcph->window = htonl(65535);
    	tcph->check = 0;
    	tcph->urg_ptr = 0;
     
    	iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);
     
    	if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL,(char *)&on, sizeof (on)) < 0)
    	{
    		puts("Warning: Cannot set HDRINCL!\n");
    	}
     
    	if (sendto(sockfd, datagram, iph->tot_len, 0, (struct sockaddr *) &sain, sizeof (sain)) < 0)
    	{
    		perror("sendto");
    	}
    	else
    	{
    		puts("ok\n");
    	}
    	return 0;
    }
    Je ne comprends pas vraiment cette erreur étant donné que je suis bel et bien loggué en root lors de l'execution du programme.

    Je vous remercie d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olbat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define IP_SRC 127.0.0.1
    #define IP_DST 213.246.63.35 
     
    	sain.sin_addr.s_addr = inet_addr("IP_DST");
    	iph->saddr = inet_addr("IP_SRC");
    Il n'est pas raisonnable de s'attaquer à des problèmes aussi complexes que les Raw Sockets si on ne maîtrise pas le C et donc son préprocesseur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define IP_SRC "127.0.0.1"
    #define IP_DST "213.246.63.35" 
     
    	sain.sin_addr.s_addr = inet_addr(IP_DST);
    	iph->saddr = inet_addr(IP_SRC);
    Je n'ai pas regardé le reste...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je n'ai pas regardé le reste...
    Tu as bien fait : son problème venait de là (je viens de tester).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse, j'ai fait les réctifications nécessaires (j'avais en effet pas fait attention aux ""), mais j'ai toujours le même problème. Une autre idée ?

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par olbat
    Merci pour cette réponse, j'ai fait les réctifications nécessaires (j'avais en effet pas fait attention aux ""), mais j'ai toujours le même problème. Une autre idée ?
    Je viens de tester et cela fonctionne chez moi : reposte ton code actuel pour voir ce qui diffère par rapport au mien.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Voilà mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <linux/ip.h>
    #include <linux/tcp.h>
     
    #define DATAGRAM_SIZE 4096
    #define PORT_DST 80
    #define PORT_SRC 1234
    #define IP_SRC "127.0.0.1"
    #define IP_DST "213.246.63.35"
     
     
    unsigned short csum (unsigned short *buf, int nwords)
    {
    	unsigned long sum;
    	for (sum = 0; nwords > 0; nwords--)
    		sum += *buf++;
    	sum = (sum >> 16) + (sum & 0xffff);
    	sum += (sum >> 16);
    	return ~sum;
    }
     
    int main(void)
    {
    	char datagram[DATAGRAM_SIZE];
    	struct iphdr *iph = (struct iphdr *) datagram;
    	struct tcphdr *tcph = (struct tcphdr *) datagram + sizeof(struct iphdr);
    	struct sockaddr_in sain;
    	int sockfd = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
    	int on;
     
    	sain.sin_family = AF_INET;
    	sain.sin_port = htons(PORT_DST);
    	sain.sin_addr.s_addr = inet_addr(IP_DST);
    	memset(&(sain.sin_zero),0,8);
     
    	memset(datagram,0,DATAGRAM_SIZE);
    	iph->version = 4;
    	iph->ihl = 5;
    	iph->tos = 0;
    	iph->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
    	iph->id = htonl(8147);
    	iph->frag_off = 0;
    	iph->ttl = 255;
    	iph->protocol = 6;
    	iph->check = 0;
    	iph->saddr = inet_addr(IP_SRC);
    	iph->daddr = sain.sin_addr.s_addr;
    	tcph->source = htons(PORT_SRC);
    	tcph->dest = htons(PORT_DST);
    	tcph->seq = 0;
    	tcph->ack_seq = 0;
    	tcph->res1 = 0;
    	tcph->doff = 5;
    	tcph->fin = 0;
    	tcph->syn = 1;
    	tcph->rst = 0;
    	tcph->psh = 0;
    	tcph->ack = 0;
    	tcph->urg = 0;
    	tcph->ece = 0;
    	tcph->cwr = 0;
    	tcph->window = htonl(65535);
    	tcph->check = 0;
    	tcph->urg_ptr = 0;
     
    	iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);
     
    	if (setsockopt(sockfd, SOL_IP, IP_HDRINCL,(char *)&on, sizeof (on)) < 0)
    	{
    		puts("Warning: Cannot set HDRINCL!\n");
    	}
    	if (sendto(sockfd, datagram, iph->tot_len, 0, (struct sockaddr *) &sain, sizeof (sain)) < 0)
    	{
    		perror("sendto");
    	}
    	else
    	{
    		puts("ok\n");
    	}
    	return 0;
    }

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par olbat
    Voilà mon code actuel
    Cela fonctionne chez moi.
    Tu pourrais par exemple vérifier si tu as SELinux qui est activé (et comment il est configuré).
    Si c'est le cas, il te faudra peut-être le configurer pour que l'envoi via "raw sockets" soit autorisé pour l'utilisateur root (cf. http://www.nsa.gov/selinux/papers/slinux/node71.html, http://www.intercode.com.au/jmorris/...orking-lj.html et http://www.lurking-grue.org/writings...licyHOWTO.html).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Je suis sous Debian Sarge, je suis allé voir sur le site de Debian, apparament SELinux est désactivé de base sous Sarge. J'ai vérifié et c'est bien le cas.
    Normalement je ne devrais pas avoir de soucis si il n'est pas activé non ?

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par olbat
    Normalement je ne devrais pas avoir de soucis si il n'est pas activé non ?
    Exact.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Peut être que je dois mettre une option suplémentaire sur le socket pour que ça passe ?

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    As-tu essayé/utilisé un/des autre(s) programme(s) envoyant des paquets via une socket raw sans avoir de problème ?
    Si oui : as-tu regardé comment ils faisaient ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Non, je n'ai jamais trouvé les sources de ce genre de programmes (je n'ai pas beaucoup cherché à vrai dire). Ce qui me trouble un peu c'est que mis à part l'utilisation de setsockopt(), je n'utilises vraiment aucunes fonctions particulières.
    J'utilise un socket en RAW, ça peut poser des problèmes niveau sécurité mais comme je suis loggué en root pour l'execution, je ne comprends pas une telle protection.
    Peut être quelque chose au niveau de ma pile IP ?

    Je me demande qu'est ce qui peut bien être la cause de cette restriction d'acces ...

    J'ai pris contact avec des développeurs du projet Debian j'attends la réponse.

    J'ai aussi commencer à chercher des programmes utilisant aussi un socket RAW, je n'en trouve pas des masses.
    Dans les applications que j'utilise mis à part iptables et ethereal je ne vois pas trop, mais ces projets ont tellement d'envergure, je ne pense pas pouvoir trouver ce que je cherche aisément.

    Donc si quelqu'un aurait un petit programme assez simple utilisant aussi un socket RAW et qui fonctionne ça serait de bienvenue.

    Je tiens aussi à te remercier pour ton aide David.

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par olbat
    Non, je n'ai jamais trouvé les sources de ce genre de programmes (je n'ai pas beaucoup cherché à vrai dire). Ce qui me trouble un peu c'est que mis à part l'utilisation de setsockopt(), je n'utilises vraiment aucunes fonctions particulières.
    J'utilise un socket en RAW, ça peut poser des problèmes niveau sécurité mais comme je suis loggué en root pour l'execution, je ne comprends pas une telle protection.
    Peut être quelque chose au niveau de ma pile IP ?

    Je me demande qu'est ce qui peut bien être la cause de cette restriction d'acces ...

    J'ai pris contact avec des développeurs du projet Debian j'attends la réponse.

    J'ai aussi commencer à chercher des programmes utilisant aussi un socket RAW, je n'en trouve pas des masses.
    Dans les applications que j'utilise mis à part iptables et ethereal je ne vois pas trop, mais ces projets ont tellement d'envergure, je ne pense pas pouvoir trouver ce que je cherche aisément.

    Donc si quelqu'un aurait un petit programme assez simple utilisant aussi un socket RAW et qui fonctionne ça serait de bienvenue.

    Je tiens aussi à te remercier pour ton aide David.
    Je ne pense pas que cela vienne de ton programme. Exemples : http://www.earth.li/projectpurple/progs/sendip.html (dans "sendip.c") ; http://www.hping.org/hping3-20051105.tar.gz (dans "sendip.c" pour sendto() et dans "opensockraw.c" pour l'ouverture de la socket, "sockopt.c" pour setsockopt()) ; etc.

    Rien dans tes logs ? (un petit " grep -A 5 -B 5-r 'sendto' /var/log/ " ?)

    Tiens nous au courant de tes résultats (cela m'intéresse).

    PS : "iptables" n'est qu'un programme qui sert à paramétrer Netfilter...qui, lui, ne fonctionne pas avec des sockets "raw" : c'est une partie du noyau (ou un module noyau).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    La commande ne me retourne aucuns résultats (après execution de mon code).

    PS : "iptables" n'est qu'un programme qui sert à paramétrer Netfilter...qui, lui, ne fonctionne pas avec des sockets "raw" : c'est une partie du noyau (ou un module noyau).
    Merci, c'est noté

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par olbat
    La commande ne me retourne aucuns résultats (après execution de mon code).
    Tu as essayé les autres programmes ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    J'ai quelques problèmes avec leurs compilations, mais je ne pense pas que ça changerait grand chose de tout de manière. Ces programmes utilisent sendto de la même façon que moi.
    J'ai tenter de regler moi l'option SO_BROADCAST sur mon socket, mais ça ne fonctionne pas.

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonsoir,

    Citation Envoyé par olbat
    J'ai quelques problèmes avec leurs compilations, mais je ne pense pas que ça changerait grand chose de tout de manière. Ces programmes utilisent sendto de la même façon que moi.
    Le bon côté des choses, c'est que le problème ne vient pas de ton programme.
    Je viens de compiler hping3 et, quand je tape...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./hping3 --rawip 192.168.0.1
    ...j'obtiens...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HPING 192.168.0.1 (eth4 192.168.0.1): raw IP mode set, 20 headers + 0 data bytes
    [send_ip] sendto: Operation not permitted
    Par contre, quand je tape...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./hping3 --rawip --data 20 192.168.0.1
    ...j'obtiens...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HPING 192.168.0.1 (eth4 192.168.0.1): raw IP mode set, 20 headers + 20 data bytes
     
    --- 192.168.0.1 hping statistic ---
    117 packets tramitted, 0 packets received, 100% packet loss
    round-trip min/avg/max = 0.0/0.0/0.0 ms
    Conclusion : le contenu (ou son absence) peut provoquer un refus.

    Ce que je te propose :
    1) lancer une capture avec wireshark
    2) connecte-toi quelque-part où tu as le droit avec telnet
    3) dès la connexion établie, arrête telnet
    4) arrête la capture
    5) garde les paquets échangés lors de la connexion (le "handshake", normalement, et peut-être quelques données) et jette les autres (si tu avais d'autres applications réseau en même temps)
    6) prends le premier paquet (SYN) et récupère son contenu exact
    7) modifie ton appli. pour qu'exactement le même contenu soit envoyé à la même adresse sur le même port qu'au point 2
    8) compile
    9) teste.

    Cordialement,
    DS.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Voilà, ça fonctionne avec une petite modification au niveau des flags concernant les fragments:
    devient
    En fait comme la structure d'ip.h regroupe les flags de fragments et le fragment d'offset dans une seule partie, je n'y avait pas prêté attention.
    Apparemment je ne peux pas envoyer de paquets si la demande de "non-fragmentation" des paquets n'est pas faite au niveau de l'entête.

    Donc le programme fonctionne pour envoyer le paquet, et je reçois une réponse.
    Maintenant il reste un petit soucis (je pense que c'est à l'utilisation d'un raw socket ), je n'arrive pas à visionner la trame que j'envoie (ni celle que je reçois d'ailleurs) via Ethereal.

    Dans tous les cas, je te remercie beaucoup pour ton aide David

  19. #19
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonsoir,

    Citation Envoyé par olbat
    Voilà, ça fonctionne avec une petite modification au niveau des flags concernant les fragments:
    devient
    En fait comme la structure d'ip.h regroupe les flags de fragments et le fragment d'offset dans une seule partie, je n'y avait pas prêté attention.
    Apparemment je ne peux pas envoyer de paquets si la demande de "non-fragmentation" des paquets n'est pas faite au niveau de l'entête.

    Donc le programme fonctionne pour envoyer le paquet, et je reçois une réponse.
    J'ai un peu réfléchi à la question aujourd'hui (5 minutes, donc "ça vaut ce que ça vaut") et je vois trois choses qui peuvent différer entre nos systèmes au point que le programme (sans ta dernière modification) fonctionne chez moi et pas chez toi :
    - la version du noyau (les règles d'acceptation/refus d'un paquet ont peut-être changé entre ma version et la tienne) ;
    - les options du noyau (cf. "/proc/sys/net/*") ;
    - les pilotes de nos cartes réseau (qui n'implémenteraient pas les mêmes choses de la même façon) [1].
    Si j'y pense et si j'ai le temps, j'essaierai sur une autre machine (avec un noyau radicalement différent).

    Citation Envoyé par olbat
    Maintenant il reste un petit soucis (je pense que c'est à l'utilisation d'un raw socket ), je n'arrive pas à visionner la trame que j'envoie (ni celle que je reçois d'ailleurs) via Ethereal.
    Je viens d'essayer et j'y arrive. Tu as peut-être sélectionné la mauvaise interface de capture ? J'ai choisi "lo" (car l'adresse source est "127.0.0.1").
    Par contre, ce qui est capturé est faux chez moi (mauvais numéros de ports, checksum incorrect, etc)...à creuser (pour moi)...

    Citation Envoyé par olbat
    Dans tous les cas, je te remercie beaucoup pour ton aide David
    C'était un plaisir : j'ai appris des choses. Et puis...tu peux aussi remercier Emmanuel

    Cordialement,
    DS.

    [1] - Improbable dans notre exemple puisque un pilote ne travaille pas au niveau "réseau". Mais il y a peut-être un lien indirect...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par David.Schris
    C'était un plaisir : j'ai appris des choses.
    +1
    Et puis...tu peux aussi remercier Emmanuel
    J'ai surtout lu...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Socket Permission denied java 7u51
    Par gbalieu dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/05/2014, 13h06
  2. SendTo : Permission denied
    Par kyrillos52 dans le forum Réseau
    Réponses: 14
    Dernier message: 20/06/2011, 09h07
  3. [socket RAW] sendto ne marche pas !
    Par poporiding dans le forum C++
    Réponses: 4
    Dernier message: 18/01/2006, 13h14
  4. [PostgreSQL]permission denied
    Par alex2205 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/02/2003, 13h27
  5. App Socket Raw avec VC++6
    Par Martin Soucy dans le forum Développement
    Réponses: 3
    Dernier message: 04/12/2002, 05h07

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