Socket fonction Bind génère segmentation fault
Résolu
nicosan
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
nicosan92 Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
nicosan92 Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en train de faire un petit serveur en C sous Linux et il s'avère que lorsque j'utilise ma fonction bind, le code génère une segmentation fault.
voici le code en cause :
Je suis un petit peu à la bourre et je n'arrive pas à comprendre d'où vient l'erreur. Et sans ça, je ne sais pas avancer.
Merci beaucoup pour votre éventuelle réponse
Je suis en train de faire un petit serveur en C sous Linux et il s'avère que lorsque j'utilise ma fonction bind, le code génère une segmentation fault.
voici le code en cause :
int setServer(int *sockNumber){ struct sockaddr_in sockAddr; //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("107.0.0.1"); if (bind (*sockNumber, (struct sockaddr *)&sockAddr, sizeof(sockAddr))==-1) { perror(errno); writeLog(FILENAME, "Erreur Bind"); return -1; } else printf("wp"); return 1; }
Je suis un petit peu à la bourre et je n'arrive pas à comprendre d'où vient l'erreur. Et sans ça, je ne sais pas avancer.
Merci beaucoup pour votre éventuelle réponse
A voir également:
- Socket fonction Bind génère segmentation fault
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
- Fonction somme excel - Guide
3 réponses
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
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é ?
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).
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 ^^
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 ^^)
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 **.