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 :

Socket, SOCK_RAW probleme recvfrom


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
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut Socket, SOCK_RAW probleme recvfrom
    Bonjour à tous,

    je souhaite réaliser une fonction ping avec le protocole ICMP, pour cela j'utilise des sockets SOCK_RAW,
    J'ai un soucis, lorsque je rajoute ma fonction de réception "recvfrom" plus rien ne s'affiche dans ma console, même tous les print de mon programme ne sont pas affichés..

    J'ai simplifié mon code, avec un simple buffer à transmettre pour simplifier la visibilité, car le problème reste entier

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <windows.h>
    #include <unistd.h>
     
    #define IP_SIZE 20
    #define ICMP_SIZE 16
    #define MAX_PACKET 100
    #define ICMP_ECHO 8
     
    SOCKET icmp_socket;
    IN_ADDR addr;
    SOCKADDR_IN icmp_sock_info;
     
     
    struct icmp
    {
    	u_char icmp_type;
    	u_char icmp_code;
    	u_short icmp_cksum;
    	u_short icmp_id;
    	u_short icmp_seq;
    	//char icmp_data[1];
    };
     
     
    static void init(void)
    {
        WSADATA wsa;
        int err = WSAStartup(MAKEWORD(2, 2), &wsa);
        if(err != 0)
        {
            puts("WSAStartup failed !");
            exit(EXIT_FAILURE);
        }
    }
     
    static void end(void)
    {
        WSACleanup();
    }
     
     
    int main(void) {
    	init();
    	int test;
     
    	int lsock =sizeof(icmp_sock_info);
    	struct icmp* icmp_buf;
    	char pkt_buf[MAX_PACKET];
     
     
    	icmp_socket= socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    	 if (icmp_socket == INVALID_SOCKET)
    	{
    	        wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
    	        //exit(1);
    	}
     
    		/* Initialisation de la structure adresse du socket */
    	icmp_sock_info.sin_family= AF_INET; // Type de socket
     
    	icmp_sock_info.sin_addr.s_addr=inet_addr("127.0.0.1");
     
     
    		/* Construction de la trame ICMP */
    		icmp_buf=(struct icmp *) pkt_buf;
    		icmp_buf->icmp_type = ICMP_ECHO;
    		icmp_buf->icmp_code=0;
    		icmp_buf->icmp_id=1; // ID à définir (id proc)
    		icmp_buf->icmp_seq=0; // Sequence à incrementer
    		//gettimeofday((struct timeval *) icmp_buf->icmp_data, NULL);
     
    		icmp_buf->icmp_cksum =0; // A DEFINIR
     
    		 char buffer[100] = "Bonjour\n";
    		 char buffer_reception[100];
     
    		test = sendto(icmp_socket, buffer, ICMP_SIZE,0,(SOCKADDR *) &icmp_sock_info,lsock);
    		if (test <= 0)
    		            perror("Erreur sendto()");
     
    		printf("\n-----------TRAME ENVOYEE-----------");
     
     
    		  n = recvfrom(icmp_socket, buffer_reception, sizeof(buffer_reception) - 1, 0, (SOCKADDR *)&icmp_sock_info,&lsock);
     
    		                if (n != SOCKET_ERROR)
    		                {
    		                    buffer_reception[n] = '\0';
    		                    printf("Un message de %s : %s", inet_ntoa(icmp_sock_info.sin_addr), buffer_reception);
    		                }
    		                else
    		                {
    		                	  perror("Erreur recvfrom()");
    		                }
     
     
    	closesocket(icmp_socket);
    	end();
    	return EXIT_SUCCESS;
    }
    Et donc, ma console reste vierge...

    merci beaucoup de m'aiguiller..

    Bonne journée à tous

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    La sortie standard est bufferisée par défaut. Si tu rajoutes un "\n" à la fin de ton printf, tu devrais au moins voir s'afficher "TRAME ENVOYEE".
    Ensuite, pourquoi tu ne reçois pas de réponse, là tout de suite j'en sais rien.

Discussions similaires

  1. [Socket][Byte] Probleme d'envoi d'une taille de fichier
    Par Erok dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 12/05/2009, 17h38
  2. Socket TCP: probleme avec select()
    Par LinuxUser dans le forum Réseau
    Réponses: 38
    Dernier message: 09/05/2007, 23h37
  3. Réponses: 8
    Dernier message: 15/02/2007, 14h14
  4. socket raw Probleme !
    Par MonsieurAk dans le forum Windows
    Réponses: 3
    Dernier message: 25/04/2006, 14h07
  5. socket et probleme librairie.
    Par doncandid dans le forum Réseau
    Réponses: 8
    Dernier message: 25/04/2006, 09h06

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