Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre du Club

    Inscrit en
    juin 2007
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 51
    Points : 60
    Points
    60

    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 :
    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 expérimenté
    Inscrit en
    décembre 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : décembre 2010
    Messages : 252
    Points : 551
    Points
    551

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •