Erreur de segmentation ???

Utilisateur anonyme -  
kilian Messages postés 8854 Statut Modérateur -
Bonjour,
Je développe un petit programme en C sous Linux.

J'ai un petit problème de segmentation j'ai beau chercher l'erreur et lire des article parlant des pointeurs je ne trouve pas l'erreur.
Voici le code :

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <errno.h>

#define IP "127.0.0.468"
#define PORT 51

int main(int argc, char *argv[])
	{
	int sockDescripteur;             // Descripteur du socket ( premetd'identifier le socket)
	char buffer[];                // Buffer ou stocker les informations recu
	struct sockaddr_in serv_addr;    // On declare la structure qui nous servira a configurer le serveur
	struct sockaddr_in client_addr;
	
	// Ouverture d'un socket 
	sockDescripteur = socket(AF_INET, SOCK_DGRAM , 0);	
	if (sockDescripteur < 0)
		{
		printf("ERREUR : Ouverture du socket impossible\n\n");
		}
	else
		{
		printf("Ouverture du socket               [ OK ]\n");

		// Configuration du serveur
		serv_addr.sin_family = AF_INET;
		serv_addr.sin_addr.s_addr = inet_addr(IP);
		serv_addr.sin_port =  htons(PORT);
		
		// Configurer l'adresse et le port
		int s_bind;
		s_bind = bind(sockDescripteur, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
		if (s_bind < 0)
			{
			printf("ERREUR : Configuration du socket impossible\n\n");
			}
		else
			{
			printf("Configuration du socket             [ OK ]\n");

			// Configurer le nombre d'ecoutes
			listen(sockDescripteur, 5);
	
			int exit_erreur = 1;
			while(exit_erreur < 0)
				{
				// Accepter une connexion
				int client_len;
				client_len = sizeof(client_addr);
				int s_accept;
				s_accept = accept(sockDescripteur, (struct sockaddr *) &client_addr, &client_len);
				if (s_accept < 0)
					{
					printf("ERREUR : Acceptation impossible\n\n");
					exit_erreur = -1;
					}
				else
					{
					printf("Connection                [ OK ]\n");
					// Recevoir des donnees
					int s_recv; 
					s_recv = recv(sockDescripteur, buffer, sizeof(buffer),0);
					if (s_recv < 0)
						{
						printf("ERREUR : Reception des donnees impossible\n\n");
						exit_erreur = -1;
						}
					else
						{
						printf("Le serveur a recu la requette :\n %s",buffer);
						}

					// Emettre des donnees
					char * msg;
					msg = "It's OK /n Good Job";
					//scanf("%s", &msg);
					//if (msg == "quit")
					//	{
					//	return(0);
					//	}
					//printf("%s", msg);
					//send(sockDescripteur, msg, sizeof(msg), MSG_OOB);

					}

				// Deconnecter le client
				shutdown(sockDescripteur, SHUT_RDWR);

				} // Fin de la boucle
			}
	
		// Fermeture du socket
		close(sockDescripteur);

		}

	printf(errno);

	return(0);
}



J'ai essayer de debugger le programme avec gdb voila ce que j'obtiens
me@debian:~$ gdb ./tests
GNU gdb 6.7.1-debian
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/i686/cmov/libthread_db.so.1".
(gdb) run
Starting program: /home/jerome/tests
Ouverture du socket                    [ OK ]
ERREUR : Configuration du socket impossible


Program received signal SIGSEGV, Segmentation fault.
0xb7eea227 in strchrnul () from /lib/i686/cmov/libc.so.6
(gdb) where
#0  0xb7eea227 in strchrnul () from /lib/i686/cmov/libc.so.6
#1  0xb7eb40c9 in vfprintf () from /lib/i686/cmov/libc.so.6
#2  0xb7ebd1d3 in printf () from /lib/i686/cmov/libc.so.6
#3  0x08048794 in main () at test_sock.c:100
(gdb)


Je ne vois pas ou est le problème.
Merci d'avance

4 réponses

kilian Messages postés 8854 Statut Modérateur 1 526
 
Salut,

printf(errno); est à remplacer par printf("%d\n", errno);
errno est un entier, pas une chaine. Quand tu mets un seul argument dans printf, il considère que c'est une chaine ;-)
0
Utilisateur anonyme
 
ok
je modifie sa tous de suite
J'avoue que je n'est pas fais attention au warning de gcc
Mais j'étais pus concentrer sur le problème de segmentation
Enfin Merci quand même.

Et sinon pour le problème de segmentation tu n'as pas une idée ?
-1
kilian Messages postés 8854 Statut Modérateur 1 526
 
Si, pour moi l'erreur de segmentation c'est ça.
printf prend errno pour une adresse alors que dans errno il peut avoir n'importe quoi. printf accède à cette fausse adresse qui n'existe pas et ça plante!
0
Utilisateur anonyme > kilian Messages postés 8854 Statut Modérateur
 
Non l'erreur de segmentation ne vient pas de ça
J'ai mis le
printf(errno);
car le code planter
De plus avec :
printf("%s\n", errno); 

(modifier %d par %s qui est plus explicite)
-1
kilian Messages postés 8854 Statut Modérateur 1 526 > Utilisateur anonyme
 
Non si tu mets %s il va prendre ça pour une chaine. Donc il va planter. Il faut mettre %d car c'est un entier.
Ou est la ligne 100 dans ton programme?
-1
Utilisateur anonyme > kilian Messages postés 8854 Statut Modérateur
 
a oué :$
désoler
j'ai répondus trop vite sans chercher

et la ligne 100 était bien ce fameux
printf(errno);
-1
kilian Messages postés 8854 Statut Modérateur 1 526 > Utilisateur anonyme
 
:-)
-1
donuts08 Messages postés 523 Statut Membre 39
 
bonjour,

bon je t'avoue que le C n'est pas ma tasse de thé mais je suis intrigué par quelque chose si tu pouvais me renseigné ^^

s_accept = accept(sockDescripteur, (struct sockaddr *) &client_addr, &client_len);

client_len est un entier donc ce n'est pas nécessaire de mettre un &, je me trompe?
-1
kilian Messages postés 8854 Statut Modérateur 1 526
 
Si! C'est un paramètre qui sert en entrée et en sortie. En entrée: la taille du conteneur d'adresse: en sortie la taille de l'adresse retournée. Donc c'est bon.

N'oublie pas de regarder ma réponse au dessus pour l'erreur de segmentation.
0
donuts08 Messages postés 523 Statut Membre 39 > kilian Messages postés 8854 Statut Modérateur
 
ok merci de m'avoir éclairé ^^
-1
Utilisateur anonyme
 
Re-Salut,

Quand on l'enlève on obtient une erreur :
warning: passing argument 3 of &#8216;accept&#8217; makes pointer from integer without a cast


Et euh sinon pour ta question je rame un peu
J'essayerai d'y répondre demain mation après une bonne nuit
-1
donuts08 Messages postés 523 Statut Membre 39
 
la réponse de kilian était parfaite mais je te remercie tout de même d'avoir essayé ^^
-1