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 : erreur 10022


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 26
    Par défaut RAW Socket : erreur 10022
    Bonsoir à tous,

    Non ce n'est pas un complot : j'ai le même problème que Code Rom ci-avant, mais la cause n'est pas la même.

    J'essaie d'envoyer un paquet en hexadécimal sur un socket, et je reçois systématiquement une erreur 10022 (argument invalide) sur ma fonction "sendto". Si je m'y suis trompé, je ne vois pas.
    Mon OS est Windows 2000 Pro. J'ai essayé sur d'autres OS pour éliminer la cause système.

    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
    #include <stdio.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    
    int main()
    {
    char var;
    WSADATA wsaData;
    SOCKET s;
    
    if (WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
    	{
    	printf("Impossible d'initialiser Winsock !\n");
    	}
    
    
    else 	{ 
    	s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
    
    	if (s == INVALID_SOCKET)
    		{
    		printf("Impossible d'initialiser un socket client !\n");
    		}
    	else
    		{
    		SOCKADDR_IN server;
    		server.sin_family       = AF_INET;
    		server.sin_addr.s_addr  = inet_addr("192.168.1.1");
    		server.sin_port         = htons(600);
    
    		char buffer[162] = { 0x00,0x00,0x00,0x9e,0xdf,0x23,0x4d,0x42,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x30,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
    
    		int val;
    		setsockopt (s, IPPROTO_IP, IP_HDRINCL, (char*)val, sizeof(val));
    
    		sendto(s, buffer, 162, 0, (struct sockaddr *)&server, sizeof(server));
    		}
    
    
    	WSACleanup();
    	}
    }
    J'ai lu les tutos, retourné les variables dans tous les sens... rien n'y fait. Quelqu'un peut-il m'aider ?

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Waw ... et quelle est notre garantie que cette suite d'octets que tu as composée constitue bien un datagramme IP valide ? En tout cas il suffit d'un coup d'oeil pour voir que c'est pas un datagramme valide. Le premier octet d'un datagramme IP ne peut être 0x00 ... Ton appel à setsockopt est également incorrect. Il faut initialiser val à 1 et passer &val et non val en paramètre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 26
    Par défaut
    Merci de ton aide Melem.

    En tout cas il suffit d'un coup d'oeil pour voir que c'est pas un
    datagramme valide.
    Euh... oui. Il manque en fait tous les headers (débutant, désolé).
    Bon, j'ai potassé la structure IP et j'ai complété. J'ai rajouté les headers IP et TCP, puis mis ma chaîne hexa dans une structure "frame" qui les suit immédiatement. J'ai également corrigé "setsockopt".

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    #include <stdio.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    
    
    #ifndef IPHEADER
    #define IPHEADER
    
    typedef struct ipheader
    {
        UCHAR ip_hl, ip_v;
        UCHAR ip_tos;
        USHORT ip_len;
        USHORT ip_id;
        USHORT ip_off, ip_flags;
        UCHAR ip_ttl;
        UCHAR ip_p;
        USHORT ip_sum;
        ULONG ip_src;
        ULONG ip_dst;
    } IPHEAD;
    
    typedef struct tcpheader
    {
        USHORT th_sport;
        USHORT th_dport;
        UINT th_seq;
        UINT th_ack;
        USHORT th_x2;
        USHORT th_off;
        USHORT th_flags;
        USHORT th_win;
        USHORT th_sum;
        USHORT th_urp;
    } TCPHEAD;
    
    typedef struct frame
    {
        char frame_cn;
    } FRAME;
    
    #endif
    
    
    
    int main()
    {
    
    WSADATA wsaData;
    SOCKET s;
    
    
    if (WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
    	{
    	printf("Impossible d'initialiser Winsock !\n");
    	}
    
    
    else 	{ 
    	s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
    
    	if (s == INVALID_SOCKET)
    		{
    		printf("Impossible d'initialiser un socket client !\n");
    		}
    	else
    		{
    		SOCKADDR_IN server;
    		server.sin_family       = AF_INET;
    		server.sin_addr.s_addr  = inet_addr("192.168.1.6");
    		server.sin_port         = htons(445);
    
    		char buffer[4096];
    		memset(buffer,0,4096);
    
                              /* complétion du header IP */
    		IPHEAD *iph = (IPHEAD *)buffer;
    		iph->ip_hl  = 5;
    		iph->ip_v   = 4;
    		iph->ip_tos = 0;
    		iph->ip_len = sizeof(IPHEAD) + sizeof(TCPHEAD);
    		iph->ip_id  = htonl(54321);
    		iph->ip_off = 0;
    		iph->ip_ttl = 255;
    		iph->ip_p   = 6;
    		iph->ip_sum = 0;
    		iph->ip_src = inet_addr("1.2.3.4");
    		iph->ip_dst = server.sin_addr.s_addr;
    
                              /* complétion du header TCP */
    		TCPHEAD *tcph = (TCPHEAD *)buffer + sizeof(IPHEAD);
    		tcph->th_sport  = htons(1234);
    		tcph->th_dport  = htons(445);
    		tcph->th_seq    = rand();
    		tcph->th_ack    = 0;
    		tcph->th_x2     = 0;
    		tcph->th_off    = 0;
    		tcph->th_flags  = 0x02;
    		tcph->th_win    = htonl(65535);
    		tcph->th_sum    = 0;
    		tcph->th_urp    = 0;
    
                             /* envoi du reste en hexadécimal */
    		FRAME *frame = (FRAME *)buffer + sizeof(TCPHEAD) + sizeof(IPHEAD);
    		frame->frame_cn = "\x00\x00\x00\x9e\xdf\x23\x4d\x42\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x01\x00\x01\x01\x00\x00\x30\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
    
    		int one = 1;
    		const int *val = &one;
    		if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) == SOCKET_ERROR)
    			printf("Impossible d`appliquer l`option IP_HDRINCL !\n");
    
    		sendto(s, buffer, iph->ip_len, 0, (struct sockaddr *)&server, sizeof(server));
    
    		}
    
    	closesocket(s);
    	WSACleanup();
    
    	/* on libère Winsock */
    
    	}
    
    }
    L'erreur persiste, y compris si je retire les parties concernant l'hexa (en rouge). Je pense donc qu'elle se situe plus tôt, dans les headers ou la définition du paquet.

    Merci !

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Toutes tes structures sont incorrectes. ipheader ne correspond pas à un en-tête IP, tcpheader ne correspond pas à un en-tête TCP et d'après ton code, on peut comprendre ce que tu veux faire avec la structure frame mais c'est aussi mal déclaré. Enfin, même si tes structures étaient correctes, ta manière de les remplir est incorrecte. Il y a encore trop de choses à rectifier qu'il est préférable que tu repartes de zéro. T'as le choix entre faire un bête copier-coller du code de la discussion d'à côté et repartir d'un bon pied avec un bon tutoriel. Prends celui-ci par exemple.

Discussions similaires

  1. Erreur 10022 RAW Socket
    Par Code Rom dans le forum Réseau
    Réponses: 7
    Dernier message: 05/04/2012, 18h05
  2. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  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