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 :

erreur de segmentation


Sujet :

Réseau C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 10
    Par défaut erreur de segmentation
    bonjour voici mon code si qq1 peut m'aider
    qd je compile sous ubuntu g un message erreur de segmentation je pense que c'est le pointeur mais je ne suis pas sur
    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
    124
    125
    126
    int sock_CS, sock_SC, yes=1, t, tempo;
    char buffer[1024];
    char *text;
    socklen_t longueur;
    socklen_t length;
    struct sockaddr_in CS;
    struct sockaddr_in SC;
    char saisie[11];
    char tab[14];
    char dest[14];
    char a,b,c,d,e,f,g,h,i,j,k;
    connexion(){
     #if defined (WIN32)
             WSADATA WSAData;
             int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
         #else
             int erreur = 0;
         #endif
     
        //Création des sockets client->serveur et serveur->client
        sock_CS = socket (AF_INET, SOCK_DGRAM, 0); 
        //printf("Le numéro de socket client -> serveur est %d \n", sock_CS);
        sock_SC = socket (AF_INET, SOCK_DGRAM, 0); 
        //printf("Le numéro de socket serveur -> client est %d \n\n", sock_SC);
     
     
        // Initialisation à zéro des sockets client->serveur et serveur->client
        bzero (&CS, sizeof (CS));
        CS.sin_family = AF_INET;
        CS.sin_addr.s_addr = inet_addr (IP_ADDRESS);
        CS.sin_port = htons(PORT_CS);
        bzero (&SC, sizeof (SC));
        SC.sin_family = AF_INET;
        SC.sin_addr.s_addr = inet_addr (IP_ADDRESS);
        SC.sin_port = htons(PORT_SC);
        //Ecoute du port de communication
        if (bind (sock_CS, (struct sockaddr *)&CS, sizeof (CS)) == -1) {perror ("bind"); close (sock_CS);}
     
        // Récupère les références de l'émetteur
        if (getsockname (sock_CS, (struct sockaddr *)&CS, &length) == -1) {perror ("getsockname"); close (sock_CS);}
     
    }
     
    envoi() {
        if (sendto (sock_SC, text, strlen(text)+1, 0, (struct sockaddr *)&SC, sizeof(SC)) == -1) {
    	perror ("sendto");
    	 close (sock_SC);
    	}
    	printf("Envoi de: %s\n", dest);
    }
     
     
    main(){
    connexion();
    //sleep(7);
    printf("Le numéro de socket client -> serveur est %d \t\n\n", sock_CS);
    //sleep(4);
    printf("Le numéro de socket serveur -> client est %d \t\n\n", sock_SC);
    //sleep(4);
    printf ("La connexion serveur sur la socket %d et le port %d est établie.\t\n\n", sock_CS, ntohs (CS.sin_port));
    //sleep(6);
    printf("---------------Veuillez patienter quelques secondes.............------------\n\n\n\n");
    //sleep(5);
    printf("Veuillez saisir votre Pseudo\n");
    fflush(stdout);
    fgets(saisie,sizeof saisie,stdin);
    a=saisie[0]; 
    b=saisie[1];
    c=saisie[2];
    d=saisie[3];
    e=saisie[4];
    f=saisie[5];
    g=saisie[6];
    h=saisie[7];
    i=saisie[8];
    j=saisie[9];
    k=saisie[10];
    tab[0]='A';
    tab[1]='B';
    tab[2]='O';
    tab[3]= a;
    tab[4]= b;
    tab[5]= c;
    tab[6]= d;
    tab[7]= e;
    tab[8]=f;
    tab[9]=g;
    tab[10]=h;
    tab[11]=i;
    tab[12]=j;
    tab[13]=k;
    strcpy(dest,tab);
     
    printf("le tableau contient %s \n\n ", dest);
    strcpy(dest, "");
    envoi(dest);
    printf("Attente d'acquitement\n");
    //for(t=0;t<14;t++){
    //do{
     
     
    	//envoi(dest);
             printf("Attente d'acquitement\n");
               if (read (sock_CS, buffer, 1024) < 0) printf (RED,"ACK en retard\n");
          // } while
     	(strcmp(buffer,"ACK") != 0);
            printf(GREEN, "Acquittement recu\n\n");
     
    //}
     
      // Fermeture de la socket
        if (close(sock_CS) == -1) perror("close");
        else printf("La socket %d est maintenant fermee\n", sock_CS);
        if (close(sock_SC) == -1) perror("close");
        else printf("La socket %d est maintenant fermee\n",sock_SC);
     
        #if defined (WIN32)
              WSACleanup();
     
         #endif
     
    //strcpy(dest,tab);
    //memset(saisie,0,sizeof saisie);
    //memset(dest,0,sizeof dest);
     
    }
    merci pour votre aide

  2. #2
    Membre éprouvé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    Bonjour,

    je n'ai pas compilé ton programme mais voici quelques remarques qui peuvent t'aiguiller.

    D'abord la fonction main retourne un int et s'écrit donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main()
    {
    ...
    }
    Pareil pour les autres fonctions, si elles ne retournent rien, il faut écrire l'entête comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void connexion()
    {
    ...
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void envoi()
    {
    ...
    }
    Tu utilises sizeof pour avoir la taille d'une chaine, il manque cependant les paranthèses pour cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	fgets(saisie,sizeof (saisie),stdin);
    Ta fonction envoi ne reçoit pas de paramètre dans sa déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void envoi()
    {
    ...
    }
    Et pourtant tu lui transfère un char * lors de son appel :

    Il y a donc un problème entre l'appel et la déclaration.

    Bref, il y a plein de petites choses qui peuvent peut être remédier à ton problème. Tu as également déclaré toutes tes variables en variables globales ce qui permet de ne pas s'encombrer lors d'appels à des fonctions mais qui va compliquer la compréhension de ton code dès que tu vas ajouter quelques lignes. Je te conseille de déclarer les variables dans la fonction main et de passer les variables en paramètre dans les fonctions.

    Bonne journée,

    Aldemius

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    *
    Tu utilises sizeof pour avoir la taille d'une chaine, il manque cependant les paranthèses pour cette fonction :
    sizeof n'est pas une fonction, c'est un opérateur et il n'est pas suivi de parenthèses. L'opérande de sizeof peut être
    - un objet,
    - une expression,
    - ou un type placé entre parenthèses (syntaxe utilisée également pour l'opérateur de cast).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(saisie,sizeof saisie,stdin);
    size_t x = sizeof (int)

    **
    En ce qui concerne la déclaration des fonctions, il faut préciser
    - le type de retour, le type de retour par défaut int est désormais non valide
    - void en l'absence de paramètres, sinon, la déclaration ne constitue pas un prototype de la fonction.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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