Socket fonction Bind génère segmentation fault
Résolu/Fermé
nicosan
Messages postés
7
Date d'inscription
lundi 12 novembre 2012
Statut
Membre
Dernière intervention
16 août 2013
-
16 août 2013 à 20:30
nicosan92 Messages postés 11 Date d'inscription mercredi 31 juillet 2013 Statut Membre Dernière intervention 19 août 2013 - 19 août 2013 à 18:15
nicosan92 Messages postés 11 Date d'inscription mercredi 31 juillet 2013 Statut Membre Dernière intervention 19 août 2013 - 19 août 2013 à 18:15
A voir également:
- Socket fonction Bind génère segmentation fault
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Fonction somme excel - Guide
- Snapchat ils m'ont ajouté par la fonction recherche - Forum Snapchat
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
3 réponses
Utilisateur anonyme
19 août 2013 à 10:24
19 août 2013 à 10:24
salut,
j'ai juste une petite question concernant tes variables :
en entrée tu donne un pointeur (int *) et tu redonne la valeur avec l'* , et donc tu passe le paramètre ** ... sachant que les methodes bind et socket (par sûr pour lui mais ca doit être ca) demandent l'adresse de ton int, les valeurs deviennent fausses ...
essaye plutot d'appeler tes fonctions de cette manière :
PAS :
MAIS :
PAS :
MAIS :
j'ai un peu l'impression que la question des pointeurs reste un confus ...
dis moi ce que ca donnera
naga
j'ai juste une petite question concernant tes variables :
en entrée tu donne un pointeur (int *) et tu redonne la valeur avec l'* , et donc tu passe le paramètre ** ... sachant que les methodes bind et socket (par sûr pour lui mais ca doit être ca) demandent l'adresse de ton int, les valeurs deviennent fausses ...
essaye plutot d'appeler tes fonctions de cette manière :
PAS :
*sockNumber=socket(...
MAIS :
sockNumber=socket(...
PAS :
bind (*sockNumber, (struct sockaddr *)&sockAddr,...
MAIS :
bind (sockNumber,sockAddr,...
j'ai un peu l'impression que la question des pointeurs reste un confus ...
dis moi ce que ca donnera
naga
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 août 2013 à 11:11
19 août 2013 à 11:11
Salut, je pense que l'erreur peut venir du sizeof. Tu lui donnes sockAddr qui a la taille du type "sockaddr_in". Dans mes programme réseau, je passe "sizeof(sockaddr)" en troisième argument de bind.
Si ce n'est pas ça, peut être le numéro du port qui est trop élevé ou déjà occupé ou réservé ?
Si ce n'est pas ça, peut être le numéro du port qui est trop élevé ou déjà occupé ou réservé ?
nicosan92
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013
19 août 2013 à 11:56
19 août 2013 à 11:56
Je vais tenter le coup, mais je cast quand même ma variable de type "sockaddr_in" en "sockaddr".
Je doute qu'il faille changer mon sizeof. Je vous tiens au courant.
Je doute qu'il faille changer mon sizeof. Je vous tiens au courant.
nicosan92
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013
19 août 2013 à 15:48
19 août 2013 à 15:48
C'est à ne plus rien comprendre. J'ai réécrit entièrement ma fonction et en fait, j'ai écrit exactement la même chose... Cela fonctionne...
Je n'ai vraiment aucune idée du pourquoi cette erreur apparaissait avant et plus maintenant.
Je n'ai vraiment aucune idée du pourquoi cette erreur apparaissait avant et plus maintenant.
Utilisateur anonyme
Modifié par nagashima le 19/08/2013 à 15:48
Modifié par nagashima le 19/08/2013 à 15:48
j'ai aussi un petit doute sur ta structure, essaye de rajouter :
histoire d'initialiser ta structure (sous la ligne //Bind du socket).
memset(&sockAddr, 0, sizeof(struct sockaddr_un));
histoire d'initialiser ta structure (sous la ligne //Bind du socket).
nicosan92
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013
19 août 2013 à 15:55
19 août 2013 à 15:55
Je sais pas si tu as vu le message que j'ai laissé au dessus ?
Voilà, ça fonctionne alors que je ne pense pas avoir changé quelque chose au code :
Voilà, ça fonctionne alors que je ne pense pas avoir changé quelque chose au code :
int setServer(int *sockNumber){ struct sockaddr_in sockAddr; char phrase[500]; //Création du socket if((*sockNumber=socket(AF_INET, SOCK_STREAM, 0))==-1){ writeLog(FILENAME, "Erreur Socket Serveur"); return -1; } //Bind du socket sockAddr.sin_family=AF_INET; sockAddr.sin_port=htons(50000); sockAddr.sin_addr.s_addr =inet_addr("127.0.0.1"); if (bind (*sockNumber, (struct sockaddr *)&sockAddr, sizeof(sockAddr))==-1) { writeLog(FILENAME, "Erreur Bind"); return -1; } return 1; }
oui j'avais vu ^^. et si ce n'est la déclaration d'un char* en plus, pas de différence x)
Après vu qu'on a pas un visu de tout il est difficile de dire le pourquoi du comment ... mais après un segmentation fault vient d'un fait qu'espace non alloué est utilisé (ou en tout cas qu'on tente de), donc tu n'es pas à l'abris de revoir l'erreur apparaître je pense.
Bien que je ne sois pas certain de la nécessitée ( je peux pas tester =/ ), rajouter le memset serai je pense une petite sécuritée en plus (en pensant à le libérer à la fin =p) qui t'évitera peu être de ravoir le problème.
Tiens moi au courant en tout cas, ca m'interesse ^^
Après vu qu'on a pas un visu de tout il est difficile de dire le pourquoi du comment ... mais après un segmentation fault vient d'un fait qu'espace non alloué est utilisé (ou en tout cas qu'on tente de), donc tu n'es pas à l'abris de revoir l'erreur apparaître je pense.
Bien que je ne sois pas certain de la nécessitée ( je peux pas tester =/ ), rajouter le memset serai je pense une petite sécuritée en plus (en pensant à le libérer à la fin =p) qui t'évitera peu être de ravoir le problème.
Tiens moi au courant en tout cas, ca m'interesse ^^
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 août 2013 à 16:05
19 août 2013 à 16:05
par rapport à ton premier message, tu as modifié l'adresse IP du bind. 127.0.0.1 est le localhost, 107.0.0.1, je ne connais pas. L'erreur viens peut être de là : bind ne triouvant pas l'adresse en local plante. -> à tester pour en être certain.
nicosan92
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013
19 août 2013 à 16:11
19 août 2013 à 16:11
Oh oui ! Bien vu ça ! Effectivement, je viens de changer en "107.0.0.1" et bind génère une erreur...
Quelle erreur stupide quand même...
Merci beaucoup !
Quelle erreur stupide quand même...
Merci beaucoup !
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 août 2013 à 16:18
19 août 2013 à 16:18
Ce n'est pas stupide comme erreur, elle peut intervenir de façon justifié dans d'autres cas. Ce que je trouve stupide c'est que bind plante tout sans laisser de message clair.
19 août 2013 à 11:04
19 août 2013 à 11:53
19 août 2013 à 11:57
Modifié par nagashima le 19/08/2013 à 15:26
donne un ** Oo
exemple : on déclare en entrée :
et quand on le passe en paramètre dans bind, on lui donne :
donc **socknumber ... (d'ailleur par la même occasion caster l'adresse de sockAddr en adresse sockaddr est pas utile je pense ...)
bind étant :
mieux vaut lui passer &sockNumber non ? (je me remet dans le bain par la meme occasion ^^)
19 août 2013 à 15:31
int *sockNumber
et quand on le passe en paramètre dans bind, on lui donne :
bind (*sockNumber,(struct sockaddr *)&sockAddr
donc **socknumber .
Bah non. sockNumber est un pointeur sur un entier. *sockNumber est donc l'entier pointé. Il s'agit bien d'un int. Et non d'un int**.
mieux vaut lui passer &sockNumber non ?
Surtout pas. Car là pour le coup tu auras un int **.