Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 14 h 27 m 34 s |
|
|
Bon j'ai un gros probleme! J'ai un serveur qui cree une socket, et fait plein de trucs enfin bon je vous passe les details.
Le probleme que j'ai, c'est que quand j'ai un client qui se connecte, le serveur lui envoie bienvenue\n. Jusque la rien d'anormal, sauf que le send que j'utilise me renvoie systematiquement -1! Et ca deviens tres penible.
J'avais mis avant un socket pour tester le file descriptor, mais le programme reste bloque dans ce select (du coup je l'ai enleve).
Je ne vais pas vous copier les sources ici, et je ne peut malheureusement pas les heberger car je n'ai pas acces a mes sites, mais envoyez moi votre mail en mp et je vous mail le .tar
Sinon pour les tests que j'ai fait, j'ai verifie que le socket est le bon (a priori il l'est, maisje peut me tromper), si la chaine etait bonne, si la longueure de la chaine etait bonne, l'initialisation de la socket, ...
Je sais plus quoi faire, si une bonne ame veut m'aider...
|
|
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 114 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 20 m 57 s |
|
|
Socket TCP ou UDP ?
Ca change pas mal de choses si mes souvenirs sont bons...
Tu peux au moins nous mettre le code de création/binding de socket ?
Et tu as fait un coup de tcpdump histoire de voir si y a une ouverture de connexion si TCP ?
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 25 m 08 s |
|
|
ben y a une ouverture de connexion, mon client se connecte, et je suis pres a parier que le receive fonctionne (ca marchait avant, y a pas de raisons, mais bon...).
C'est le send qui me renvoie systematiquement -1.
Je te copie le code de creation de la socket.
Bon desole la balise code marche pas!
Au pire regarde la source de mon message.
1. //
2. /*
3. ** init_socket.c for zappy in /u/ept3s/......../rendu/c/zappy
4. **
5. ** Made by ************
6. ** Login <*******@epita.fr>
7. **
8. ** Started on Fri Jun 3 16:17:04 2005 *************
9. ** Last update Fri Jun 17 14:09:21 2005 Woofy
10. */
11.
12. #include <stdio.h>
13. #include <arpa/inet.h>
14. #include <netinet/in.h>
15. #include <sys/socket.h>
16. #include <sys/types.h>
17. #include "serveur.h"
18. #include "proto.h"
19.
20.
21. void alloc_fd(t_env *e, int fd)
22. {
23. e->fdt[fd] = xmalloc(sizeof(*e->fdt[fd]));
24. memset(e->fdt[fd], 0, sizeof(*e->fdt[fd]));
25. }
26.
27. int create_bind(int port)
28. {
29. int s;
30. int dum;
31. struct sockaddr_in sin;
32.
33. s = socket(PF_INET, SOCK_STREAM, 0);
34. dum = 1;
35. if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &dum, sizeof(dum)) < 0)
36. {
37. perror("setsockopt");
38. exit (0);
39. }
40. sin.sin_family = AF_INET;
41. sin.sin_port = htons(port);
42. sin.sin_addr.s_addr = INADDR_ANY;
43. xbind(s, (struct sockaddr *)&sin, sizeof(sin));
44. xlisten(s, 42);
45. return (s);
46. }
47.
48. void init_socket(t_env *e)
49. {
50. int fd;
51.
52. fd = create_bind(e->port);
53. alloc_fd(e, fd);
54. e->fdt[fd]->type = FD_SERVER;
55. set_max_fd_used(e, fd);
56. }
57.
|
|
| |
Message de gege38 le 17 juin 2005 - 16 h 26 : bug sur la balise codee
|
| |
Message édité 3 fois, la dernière par Woofy le 17 juin 2005 - 17 h 15. |
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 26 m 51 s |
|
|
arf, edit pas en meme temps que moi
|
|
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 114 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 28 m 42 s |
|
|
Ton code a l'air correct pour l'ouverture de socket mais on dirait que ton allocateur mémoire est faux...
Faudrait pas *e-> à la place de e-> ?
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 29 m 45 s |
|
|
pas moi qui ai fait, et je t'avoue que moi et les pointeurs... 
Bon je vais voir, c'est a quelle ligne? Dans les xmallocs?
EDIT : surtout que j'ai aucun warning a la compilation malgres les option -Wall et -pedantic
|
|
| |
Message édité 1 fois, la dernière par Woofy le 17 juin 2005 - 16 h 31. |
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 114 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 31 m 49 s |
|
|
Le 17 juin 2005 - 16 h 29, Woofy a écrit :
pas moi qui ai fait, et je t'avoue que moi et les pointeurs... 
Bon je vais voir, c'est a quelle ligne? Dans les xmallocs?
|
Ouais...
Parce que si la connexion TCP est ok, que tu récupères un port client, et que tu receives correctement, c'est que le pb n'est pas réseau je pense...
Maintenant, normalement, dans le send tu fais passer une string... Donc à jeter un coup d'oeil par là
Mais bon, je peux me tromper. Le C, ca fait 4 ans que j'y ai plus touché
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 37 m 54 s |
|
|
ben je fait bien passer une string dans mon send, et pour etre bien sur je l'avais ecrite en dur. Ca a pas mieux marche.
Bon je teste.
EDIT : bah ca a rien change du tout! Pas de Warnings, et pas de send
|
|
| |
Message édité 1 fois, la dernière par Woofy le 17 juin 2005 - 16 h 39. |
| |
Totalement inutile, donc completement indispensable 
|
gege38
- Ancien Modérateur -
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 114 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 40 m 46 s |
|
|
Mmm.. Je passe la main alors à plus expert que moi...
Désolé
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 16 h 41 m 09 s |
|
|
Ma fonction send :
1. //
2. /*
3. ** xsend_client.c for in /u/ept3s/nicola_f/rendu/c/zappy
4. **
5. ** Made by Woofy
6. ** Login <*****@epita.fr>
7. **
8. ** Started on Thu Jun 16 16:06:14 2005 Woofy
9. ** Last update Fri Jun 17 14:00:29 2005 Woofy
10. */
11.
12. #include <unistd.h>
13. #include <stdlib.h>
14. #include <sys/socket.h>
15. #include "my.h"
16.
17. int xsend_client(int fd, char *str)
18. {
19. char *message;
20. char *bufsend;
21. char *oldsend;
22. int lenwrite;
23. int lensend;
24.
25. my_putnbr(fd);
26. my_putstr(" <== ");
27. my_putstr(str);
28. my_putchar('\n');
29. message = my_strdup(str);
30. bufsend = malloc((my_strlen(message) + 1) * sizeof(char));
31. oldsend = bufsend;
32. bufsend = my_strcat(message, "\n");
33. lensend = my_strlen(bufsend);
34. while (lensend > 0)
35. {
36. if ((lenwrite = send(fd, bufsend, lensend, 0)) == -1)
37. {
38. my_putstr("Error dans le send\n");
39. exit(-1);
40. }
41. lensend -= lenwrite;
42. while (lenwrite--)
43. bufsend++;
44. }
45. free(oldsend);
46. my_putstr("DEBUG SORTIE\n");
47. return (0);
48. }
|
|
| |
Message édité 1 fois, la dernière par Woofy le 17 juin 2005 - 17 h 15. |
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
|
| |
Totalement inutile, donc completement indispensable 
|
Erel69
206 (¯`·.__[T3aM.L1b3rTe©]__.·´¯)
Messages : 19 449 Inscrit le 07/11/01
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 17 h 01 m 22 s |
|
|
1. // anti bug
2. /*
3. ** xsend_client.c for in /u/ept3s/nicola_f/rendu/c/zappy
4. **
5. ** Made by Woofy
6. ** Login <*****@epita.fr>
7. **
8. ** Started on Thu Jun 16 16:06:14 2005 Woofy
9. ** Last update Fri Jun 17 14:00:29 2005 Woofy
10. */
11.
12. #include <unistd.h>
13. #include <stdlib.h>
14. #include <sys/socket.h>
15. #include "my.h"
16.
17. int xsend_client(int fd, char *str)
18. {
19. char *message;
20. char *bufsend;
21. char *oldsend;
22. int lenwrite;
23. int lensend;
24.
25. my_putnbr(fd);
26. my_putstr(" <== ");
27. my_putstr(str);
28. my_putchar('\n');
29. message = my_strdup(str);
30. bufsend = malloc((my_strlen(message) + 1) * sizeof(char));
31. oldsend = bufsend;
32. bufsend = my_strcat(message, "\n");
33. lensend = my_strlen(bufsend);
34. while (lensend > 0)
35. {
36. if ((lenwrite = send(fd, bufsend, lensend, 0)) == -1)
37. {
38. my_putstr("Error dans le send\n");
39. exit(-1);
40. }
41. lensend -= lenwrite;
42. while (lenwrite--)
43. bufsend++;
44. }
45. free(oldsend);
46. my_putstr("DEBUG SORTIE\n");
47. return (0);
48. }
L'anti-bug à utiliser tu apprendras
|
|
| |
Obscurité au-delà du crépuscule, pourpre au-delà du sang qui coule, enfoui dans le flot du temps, en ton haut nom, je jure fidélité à l'obscurité. Que les fous qui se dressent devant nous soient détruits, par le pouvoir que toi et moi possédons...
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 17 h 16 m 14 s |
|
|
Merci! 
Mais ca ne debug que l'affichage, pas la fonction
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 427 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 17 juin 2005 - 19 h 54 m 53 s |
|
|
tu as testé, par hasard, le retour de malloc ? On sait jamais. Et en passant : en C, sizeof (char) = 1
Sinon tu es sûr de tes pseudo-fonctions "my_xxx" ? Vérifie la sortie, par exemple "message = my_strdup(str);" : le pointeur est bien non null ? et y'a quoi dedans ? Parce que si c'est pas ok, "my_strlen(message)" va pas donner quelque chose de bien beau...
Y pas pas de raison que ça marche pas, les sockets c'est quand même bien stabilisé, il me semble
Et un sniffer réseau, tu pourrais un faire fonctionner un pour voir si y'a quelque chose qui part/arrive (et quoi) ?
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 17 juin 2005 - 20 h 13 m 05 s |
|
|
ma fonction xmalloc est un malloc verifie. Donc ca a priori c'est bon.... argh, je viens de voir que j'ai utilise un malloc! Honte a moi, je le remplace.
Pour mes fonctions, oui j'en suis sur, j'en ai suffisament chie pour les faires marcher.
Mais je vais tout reverifier.
EDIT : pour le sniffer reseau, j'avoue que je n'en connais aucun, et je ne sais pas trop comment ca marche.
J'ai utilise une fois ethereal sous win, mais la je suis sous BSD.
|
|
| |
Message édité 1 fois, la dernière par Woofy le 17 juin 2005 - 20 h 13. |
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 427 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 17 juin 2005 - 20 h 43 m 40 s |
|
|
Le 17 juin 2005 - 20 h 13, Woofy a écrit :
ma fonction xmalloc est un malloc verifie. Donc ca a priori c'est bon.... argh, je viens de voir que j'ai utilise un malloc! Honte a moi, je le remplace.
Pour mes fonctions, oui j'en suis sur, j'en ai suffisament chie pour les faires marcher.
Mais je vais tout reverifier.
|
rien de tel qu'un bon débug ligne à ligne (y'en a pas beaucoup, tu as de la chance)
ça te permettra de voir si par hasard chaque chaine de caractère est bien terminée, chaque pointeur est bien alloué. Parce qu'une chaine qui se finit pas pas \0, ça arrive, ça fait parfois pas de dégat (par chance, y'a un autre \0 un peu plus loin), mais parfois ça fout la merde ! Et un pointeur foireux (null, ou écrasé par un autre qui te fait pointer ta chaine où tu veux surtout pas) on s'en rend pas forcément compte tout de suite...
Et oui, le boulot d'informaticien, c'est pas toujours faire des trucs neufs et super sympa
EDIT : pour le sniffer reseau, j'avoue que je n'en connais aucun, et je ne sais pas trop comment ca marche.
J'ai utilise une fois ethereal sous win, mais la je suis sous BSD.
|
un simple sniffer ça peut juste te donner le contenu de ce qui circule sur les trames, ou alors d'autres un peu plus sophistiqués peuvent te donner une trace du dialogue entre le client et le serveur.
Mais sinon, un bon printf des familles, c'est un bon début !
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 427 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 17 juin 2005 - 20 h 47 m 24 s |
|
|
ah, et puis j'oubliais : un bon coup de lint, ça fait pas de mal, avec un Nlevel=4 il te laisse rien passer !
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 18 juin 2005 - 08 h 37 m 45 s |
|
|
Bon, tout est bon (j'ai pas passe lint, je suis en train de potasser le man, je decouvre). 
Ca ne serait pas au niveau de la socket qui serait pas configuree en ecriture?
|
|
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 18 juin 2005 - 18 h 35 m 43 s |
|
|
Bon j'ai integre ma fonction dans le select du programme, et bien sur le select ne trouve rien!
Je sais plus quoi faire 
Je vais quand meme reverifier le fd!
|
|
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 577 Inscrit le 11/01/02
Ville : Lyon
Non connecté
|
|
Posté le 18 juin 2005 - 18 h 55 m 57 s |
|
|
Bon j'ai du nouveau : C'est le file descriptor qui n'est pas bon!
En fait, lors de la connexion, il vois mon client sur le fd 6, et quand il recoit des trucs, il les recoit sur le fd 7.
Rien dans le code n'a l'air de transparaitre, ca peut etre n'importe ou! Je comprend absolument pas!
C'est pas possible qu'il passe d'un fd a un autre, si?
|
|
| |
Totalement inutile, donc completement indispensable 
|