Erreur flagrante? Serveur (sockets + threads) - C - Programmation
Marsh Posté le 09-11-2005 à 23:47:42
exit, c'est moche
Code :
|
a mon avis ton test est pas bon, tu dois vérifier que write te retourne bien le meme nombre d'octet que tu lui a demandé d'ecrire
Marsh Posté le 09-11-2005 à 23:51:33
Code :
|
tordu
Code :
|
Code :
|
pour ce genre de chose, je trouve while plus logique est plus lisible
sinon spa trop mal, par contre je suis vraiment pas allé dans le detail
Marsh Posté le 10-11-2005 à 00:02:55
chrisbk a écrit : exit, c'est moche
|
exit C'est juste moche ou c'est deprecated (j'aime bien ce mot )? return c'est mieux?
pour le write j'ai teste si ca avait pas echoue.Ce serait mieux si je faisais ca?
Code :
|
Citation :
|
voui c'est sur...vais changer ca.
Citation : sinon spa trop mal, par contre je suis vraiment pas allé dans le detail |
merci.si en superficiel deja ca le fait....
Marsh Posté le 10-11-2005 à 00:06:54
gocho a écrit : exit C'est juste moche ou c'est deprecated (j'aime bien ce mot )? return c'est mieux? |
juste moche, il vaut mieux faire remonter l'erreur aussi haut que possible, des fois qu'il y ait des liberations de ressources a faire
Citation :
|
ca te fais deux strlen, et trois appels de fonction sur une meme ligne, ca devient guere lisible
Citation : size_t truc = strlen(message); |
et zou avec truc
gocho a écrit : |
bin ptet je traine trop ici, a force de voir des horreurs accablante on perds la faculté a chercher la ptite bete
Marsh Posté le 10-11-2005 à 00:08:27
Code :
|
y sort d'ou, ce sock ?
(bon sinon les vars globales, ca aussi c'est moche)
Marsh Posté le 10-11-2005 à 00:16:41
euh j'ai po trop compris le "zou avec truc " ^^
le sock c'est quand j'ai renomme mes variables, j'ai oublie celle la (et je m'etonnais de me taper un segfault quand je terminais....je comprends un peu maintenant
Sinon ouais ca se compile et ca se lance (enfin aujourd'hui parce que j'ai fait quelques modifs dessus toute a l'heure et j'ai pas eu le temps de les reporter ici )
Marsh Posté le 10-11-2005 à 00:17:18
bin des "sock" t'en a plein ton programme, donc je m'etonne un peu que ca compile
Marsh Posté le 10-11-2005 à 00:18:06
et pour les globales vaut mieux que je les declare dans le main et que je les passe en param de chaque fonction ou j'en ai besoin?
Marsh Posté le 10-11-2005 à 00:19:26
pour le sock ca depend des fonctions en fait, il me semble que c'etait le seul.
Dans les autres c'est normal (enfin va falloir que je repasse ca au crible : : )
Marsh Posté le 10-11-2005 à 00:19:41
bin vu leur tronche, deja je dirais qu'elles iraient bien dans une structure, vu qu'elles servent a decrire une seule et meme chose (un serveur et ses clients), ca te limitera le paquet
apres comme t'es en environnement multithread, il faut que tu geres avec attention l'utilisations de ce genre de variable partagée entre plusieurs thread. (utilisation de synchronisation)
Marsh Posté le 10-11-2005 à 00:21:56
ah...j'pensais bien que ca viendrait la.
Comme j'ai pas encore vraiment bien capte tout ca :
La synchro c'est comment on la fait? c'est juste empecher deux threads d'acceder a la meme variable en meme temps avec les mutex c'est ca? (j'ai jete un coup d'oeil mais pas encore eu le temps de m'atteler a la tâche)
Marsh Posté le 10-11-2005 à 00:24:44
et pour la structure un truc du genre :
Code :
|
ca le fait?
Marsh Posté le 10-11-2005 à 00:24:52
gocho a écrit : |
ouais, par exemple.
Si on prends une de tes boucles
Code :
|
la c'est dangeureux car tu te bases sur une borne qui peut potentiellement varier. Imagine la cas le plus moche,
thread 1 : compare i (2) avec case_libre (3)
thread 1: entre dans la boucle (condition valide)
thread 2 : decremente case_libre, libere la vieille socket situé en client[2]
thread 1 : essaye d'ecrire sur client[2]
Blam
Marsh Posté le 10-11-2005 à 00:25:53
gocho a écrit : et pour la structure un truc du genre :
|
ouais, un peu bourrin mais disons que tu debutes alors oui
par contre tu peux t'eviter des lignes
Code :
|
Marsh Posté le 10-11-2005 à 00:26:11
ah j'avoue ca va faire un gros bouzin si ca se passe ca...hop poubelle le programme
Marsh Posté le 10-11-2005 à 00:27:19
gocho a écrit : ah j'avoue ca va faire un gros bouzin si ca se passe ca...hop poubelle le programme |
vala. Donc faut proteger au mutex. Ca allourdi le code donc essaye de faire ca proprement
(le multithread c'est clairement pas chose facile)
Marsh Posté le 10-11-2005 à 00:28:31
oue j'aime bien voir toutes les lignes, l'optimisation des lignes c'est pas mon truc
Sinon pourquoi bourrin? qu'est ce qu'il y aurait de moins bourrin?(ve apprendre moi )
Marsh Posté le 10-11-2005 à 00:29:26
gocho a écrit : |
Bin ce qu'il y a de bourrin c'est le codage direct du nombre de client max et ce genre de truc. Ca fait des gros tableaux dans une structure, c'est pas forcement élegant. une alloc dynamique serait de bon aloy, quoi
Marsh Posté le 10-11-2005 à 00:30:23
ben d'apres ce que j'ai vu sur les mutex ca donnerai un truc dans le style :
Code :
|
Is it right?
Marsh Posté le 10-11-2005 à 00:31:15
chrisbk a écrit : Bin ce qu'il y a de bourrin c'est le codage direct du nombre de client max et ce genre de truc. Ca fait des gros tableaux dans une structure, c'est pas forcement élegant. une alloc dynamique serait de bon aloy, quoi |
un p'ti coup de malloc donc...j'vais commencer a bien le gerer celui la a la fin
edit : attends attends...si je declare mon tableau de client avec un malloc.
il est donc NULL au debut.
Mais si je le remplis, ca veut dire realloc a chaque nouveau client/depart de client ?c'est bien ca ( inside)?
Marsh Posté le 10-11-2005 à 00:33:34
en gros, mais pas que dans le main hein ? tes fonctions envoi_limite et envoi_general en profiterait bien aussi, par exemple.
Y'a de la bonne base, mais y'aurait pas mal de chose a faire sur ton code pour le rendre plus chouette et solide, seulement la chui un peu claqué Essaye de voir si certaines parties peuvent etre redécoupée en fonction (pour racourcir d'autre fonctions), et betement aussi essaye de sortir le code de main() qui n'a rien a y faire (grosso modo, tout ) et qui donc serait mieux dans une fonction
Marsh Posté le 10-11-2005 à 00:36:13
oui oui le mutex quand je disai dans le main ,j'entendai par la dans chaque fonction ou je modifie une variable.
comment ca redecoupees? enfin je comprends c'que ca veut dire mais quoi par exemple?
Sinon pour le main en fait je compte laisser au final que de l'appel de fonction, c'est juste que tout ce qui reste n'a pas encore ete fait
Marsh Posté le 10-11-2005 à 00:36:38
gocho a écrit : un p'ti coup de malloc donc...j'vais commencer a bien le gerer celui la a la fin |
bon, globalement, je verrais un truc comme ca (vite fait, hein, en me basant sur ton code)
Code :
|
(je torche un brin, pas de test ni rien)
et pour la suite des operations tu bosses sur ta structure "MonServeur"
Marsh Posté le 10-11-2005 à 00:38:27
ok.donc du dynamique au maximum...on va essayer hein.
Par contre : a quoi sert le const? je l'ai deja vu mais jamais encore reussi a capter a quoi qu'il sert.
Marsh Posté le 10-11-2005 à 00:39:17
gocho a écrit : ok.donc du dynamique au maximum...on va essayer hein. |
c'est du "je regarde, mais je touche pas"
donc la ca signifie que je prends une chaine en entree, mais que je "m'engage" (avec l'aide du compilo) a ne pas la modifier
Marsh Posté le 10-11-2005 à 00:41:28
ok. parametre non modifiable par la fonction donc...
il me semble aussi en avoir deja vu sur la fonction non?
du genre const int machin_truc (arg1, arg2) c'est possible ca?
Et si oui ca sert a quoi?
Marsh Posté le 10-11-2005 à 00:41:58
bin la ca veut dire que tu renvoie un entier const, ce qui est d'une utilité discutable
Marsh Posté le 10-11-2005 à 00:43:08
ouep c'est clair...enfin c'est pas le sujet : je m'egare.
je sais maintenant comment occuper mon demain aprem'
edit : oue pareil moi non plus (bonne nuit inside) et pour ceux qui passent par la n'hesitez pas a poster pour me dire si vous voyez d'autres choses
Marsh Posté le 10-11-2005 à 07:07:45
gocho a écrit : ah...j'pensais bien que ca viendrait la. |
http://mapage.noos.fr/emdel/pthreads.htm
Marsh Posté le 10-11-2005 à 08:45:16
ok.donc faut que je vois du cote du mutex en parallele avec le pthread_join pour que ce soit optimal donc.
Plus qu'a faire tout ca maintenant...
Marsh Posté le 13-11-2005 à 22:45:46
Re bonsoir.
Alors apres un peu de retard j'ai pu me replonger dans mon petit projet.
j'ai retravaille tout ca pour regler toutes les erreurs que j'avais lors de la compilation mais il en reste une que je comprends pas :
Quand je compile gcc me renvoie un desagreable : collect2 : ld returned 1 exit status
Est ce que quelq'un pourrait me dire ce que ca veut dire (dois je reposter le code?)
merci bien
Marsh Posté le 13-11-2005 à 23:12:09
je l'ai poste sur un sujet a part, je me dis que ca pourrait reservir a quelqu'un
http://forum.hardware.fr/hardwaref [...] 0093-1.htm
Marsh Posté le 08-11-2005 à 23:38:13
Bien le bonjour a tous!
Voila j'ai cette annee un projet tutore a faire(2e annee de dut info gestion).Pour cela je suis en train de developper un serveur multiclient en C.J'utilise donc les threads et les sockets, et je travaille sous linux (y'aura ptet du windows dans l'affaire plus tard mais c'est optionnel si le temps le permet)
Ne connaissant pas grand chose a la programmation reseau, j'ai cherche sur le net des tuto, des exemples et tout ce qui pouvait m'aider et grace a tout ca et pas mal de temps j'en ai sorti quelquechose qui devrait etre potable (non non c'est pas portable )
Seulement avant de continuer plus loin, et au vu de ma tres petite experience dans la prog reseau je souhaiterai savoir si dans le code de mon serveur, il vous apparait des erreurs grossieres, des failles assez moches ou memes des fuites de memoires.
Enfin je voudrais avoir au final un code si possible le plus propre possible donc je demande un peu d'aide exterieure
J'avoue c'est un peu long alors je remercie d'avance ceux qui auront la patience de tout lire et de m'aider
Merci
Message édité par gocho le 10-11-2005 à 00:14:39