Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1593 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C/C++] Sockets en UDP, problème d'envoi à une IP

n°379798
mrbebert
Posté le 01-05-2003 à 21:33:34  profilanswer
 

Reprise du message précédent :
Ca marche quand la srtucture 'to' est rempli par la fonction recvfrom(), mais pas quand celle ci est initialisée directement [:gratgrat]


Message édité par mrbebert le 01-05-2003 à 21:34:00
mood
Publicité
Posté le 01-05-2003 à 21:33:34  profilanswer
 

n°379805
CtHuLhU50
Posté le 01-05-2003 à 21:38:30  profilanswer
 

ou sinon c comme si le server ne pouvait envoyer des données qu'a la dernier ip du recfrom, comme si les autre ip n'etait plus "connecté" au server ....

n°379807
Konar
Posté le 01-05-2003 à 21:41:04  profilanswer
 

pour l'envoi de "test" du serveur vers le 2nd client, qu'est ce qui se passe en utilisant basiquement une 2eme socket ? Pasque bon, y a pas de raison que ca marche pas...
 
Par contre utiliser une seule et meme socket pour recevoir d'un poste, puis renvoyer a 2 postes differents, me semble normal que ca marche pas (surtout si elle est non bloquante) : si sur un poste une erreur se produit, ou si un malencontreux closesocket se produit, la socket est foutue, elle pourra plus jms servir, que ca soit du coté client ou serveur, et la seule solution est d'en recréer une...

n°379810
Konar
Posté le 01-05-2003 à 21:42:00  profilanswer
 

CtHuLhU50 a écrit :

ou sinon c comme si le server ne pouvait envoyer des données qu'a la dernier ip du recfrom, comme si les autre ip n'etait plus "connecté" au server ....


 
remarque interessante, surtout en mode "non connecté"...

n°379811
antsite
Je me souviens
Posté le 01-05-2003 à 21:43:37  profilanswer
 

Konar a écrit :

pour l'envoi de "test" du serveur vers le 2nd client, qu'est ce qui se passe en utilisant basiquement une 2eme socket ? Pasque bon, y a pas de raison que ca marche pas...
 
Par contre utiliser une seule et meme socket pour recevoir d'un poste, puis renvoyer a 2 postes differents, me semble normal que ca marche pas (surtout si elle est non bloquante) : si sur un poste une erreur se produit, ou si un malencontreux closesocket se produit, la socket est foutue, elle pourra plus jms servir, que ca soit du coté client ou serveur, et la seule solution est d'en recréer une...


 
 
Comme dis plus haut dans mon post suite à ta suggestion:
Ajout dans la code:
 
tempaddr.sin_addr.s_addr = inet_addr("192.168.0.246" );
SOCKET c = socket(AF_INET, SOCK_DGRAM, 0);
bind(c, (LPSOCKADDR)&tempaddr, addrsize);
connect(c, (LPSOCKADDR)&tempaddr, addrsize);
send(c, "test", 4, 0);
 
et bien le client n'a toujours rien... [:gratgrat]

n°379813
xWillow
Posté le 01-05-2003 à 21:45:33  profilanswer
 

bon j'ai changer les ports, j'ai fait des petites modifs, chez moi j'envoie deux fois de suite sur les ip differentes, je vais te passer mes sources

n°379814
mrbebert
Posté le 01-05-2003 à 21:47:15  profilanswer
 

Konar a écrit :

pour l'envoi de "test" du serveur vers le 2nd client, qu'est ce qui se passe en utilisant basiquement une 2eme socket ? Pasque bon, y a pas de raison que ca marche pas...
 
Par contre utiliser une seule et meme socket pour recevoir d'un poste, puis renvoyer a 2 postes differents, me semble normal que ca marche pas (surtout si elle est non bloquante) : si sur un poste une erreur se produit, ou si un malencontreux closesocket se produit, la socket est foutue, elle pourra plus jms servir, que ca soit du coté client ou serveur, et la seule solution est d'en recréer une...

:non:  
Y a pas de connexion. La socket envoie un paquet ... et ne sais absolument pas ce qui se passe après.
 
Il est tout à fait possible d'utiliser une même socket pour envoyer successivement à plusieurs clients différents, je l'ai déja fait (quand j'étais jeune et insouciant :D )

n°379815
Konar
Posté le 01-05-2003 à 21:47:30  profilanswer
 

ANTSite a écrit :


 
 
Comme dis plus haut dans mon post suite à ta suggestion:
Ajout dans la code:
 
tempaddr.sin_addr.s_addr = inet_addr("192.168.0.246" );
SOCKET c = socket(AF_INET, SOCK_DGRAM, 0);
bind(c, (LPSOCKADDR)&tempaddr, addrsize);
connect(c, (LPSOCKADDR)&tempaddr, addrsize);
send(c, "test", 4, 0);
 
et bien le client n'a toujours rien... [:gratgrat]


 
c koi ce bind() ???
 
aucun besoin de faire un bind pour envoyer un msg udp !
pour le poste ki recoi, oui faut faire un bind sur la socket ki ecoute, mais pour envoyer qq chose, aucun besoin de faire bind !

n°379819
antsite
Je me souviens
Posté le 01-05-2003 à 21:49:09  profilanswer
 

Konar a écrit :


 
c koi ce bind() ???
 
aucun besoin de faire un bind pour envoyer un msg udp !
pour le poste ki recoi, oui faut faire un bind sur la socket ki ecoute, mais pour envoyer qq chose, aucun besoin de faire bind !


 
Oui pardon je l'ai viré recompilé, mais ça change que dale


Message édité par antsite le 01-05-2003 à 21:50:18
n°379832
xWillow
Posté le 01-05-2003 à 21:55:15  profilanswer
 

ok donc comme j'ai tester sur un seul pc j'ai changer les ports:
donc le 2 declenche le 1 qui repond ensuite au 2 et declenche le 3.
 
 
1.c

Code :
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. int main()
  8. {
  9. int sock;
  10. struct sockaddr_in Server, Receiv, Client;
  11. int addrsize;
  12. char buf[10];
  13. sock = socket( AF_INET, SOCK_DGRAM, 0 );
  14. Server.sin_family = AF_INET;
  15. Server.sin_addr.s_addr = INADDR_ANY;
  16. Server.sin_port = htons(5000);
  17. addrsize = sizeof(Server);
  18. bind( sock, (struct sockaddr *)&Server, addrsize );
  19. // recoit du 2
  20. recvfrom( sock, buf, 10, 0, (struct sockaddr *)&Receiv, &addrsize );
  21. printf("%s\n", buf );
  22. // renvoie au 2
  23. sendto( sock, "ahah", 5, 0, (struct sockaddr *)&Receiv, addrsize );
  24. Client.sin_family = AF_INET;
  25. Client.sin_addr.s_addr = inet_addr("127.0.0.1" );
  26. Client.sin_port = htons(5001);
  27. // envoie au 3
  28. sendto( sock, "ahah", 5, 0, (struct sockaddr *)&Client, addrsize );
  29. return 1;
  30. }

 
2.c
 

Code :
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. int main()
  8. {
  9. int sock;
  10. struct sockaddr_in Server, Receiv, Client;
  11. int addrsize;
  12. char buf[10];
  13. sock = socket( AF_INET, SOCK_DGRAM, 0 );
  14. Server.sin_family = AF_INET;
  15. Server.sin_addr.s_addr = INADDR_ANY;
  16. Server.sin_port = htons(5000);
  17. addrsize = sizeof(Server);
  18. bind( sock, (struct sockaddr *)&Server, addrsize );
  19. // recoit du 2
  20. recvfrom( sock, buf, 10, 0, (struct sockaddr *)&Receiv, &addrsize );
  21. printf("%s\n", buf );
  22. // renvoie au 2
  23. sendto( sock, "ahah", 5, 0, (struct sockaddr *)&Receiv, addrsize );
  24. Client.sin_family = AF_INET;
  25. Client.sin_addr.s_addr = inet_addr("127.0.0.1" );
  26. Client.sin_port = htons(5001);
  27. // envoie au 3
  28. sendto( sock, "ahah", 5, 0, (struct sockaddr *)&Client, addrsize );
  29. return 1;
  30. }

 
et 3.c
 

Code :
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netdb.h>
  7. int main()
  8. {
  9. int sock;
  10. char buf[10];
  11. int addrsize;
  12. struct sockaddr_in Server, Receiv;
  13. sock = socket( AF_INET, SOCK_DGRAM, 0 );
  14. Server.sin_family = AF_INET;
  15. Server.sin_addr.s_addr = INADDR_ANY;
  16. Server.sin_port = htons(5001);
  17. addrsize = sizeof(Server);
  18. bind( sock, (struct sockaddr *)&Server, addrsize );
  19. // recoie du 1
  20. recvfrom( sock, buf, 10, 0, (struct sockaddr *)&Receiv, &addrsize );
  21. printf("%s\n", buf );
  22. return 1;
  23. }


Message édité par xWillow le 01-05-2003 à 22:06:59
mood
Publicité
Posté le 01-05-2003 à 21:55:15  profilanswer
 

n°379840
Konar
Posté le 01-05-2003 à 22:02:57  profilanswer
 

xWillow a écrit :

r = recvfrom(s, buf, sizeof(buf), 0, (LPSOCKADDR)&useraddr, &addrsize);
 
c'est pas sizeof(buf) mais strlen(buf) :)


 
raté : strlen(buf) = 0 (initialisé au début a buf = "" ). tu indiques donc a recvfrom que ton buffer a une taille vide, alors forcement il kiffe moyen...

n°379842
xWillow
Posté le 01-05-2003 à 22:03:47  profilanswer
 

c'es vrai que tu as raison :)
il faut mettre recvfrom( sock, buf, 10, 0 ...
j'avai mis ca parce que avec strlen(buf) marchais pas
et j'ai meme pas capté que c'etait ca alors je l'ai remi mais tu as raison
je vais corriger tout de suite dans moncode =) ( qui marche )


Message édité par xWillow le 01-05-2003 à 22:06:19
n°379847
Konar
Posté le 01-05-2003 à 22:07:32  profilanswer
 

xWillow a écrit :

c'es vrai que tu as raison :)
il faut mettre recvfrom( sock, buf, 10, 0 ...
j'avai mis ca parce que avec strlen(buf) marchais pas
et j'ai meme pas capté que c'etait ca alors je l'ai remi mais tu as raison


 
une remarque d'ailleurs : dans tout les codes postés ca manque gravement de testance des valeurs de retour des fct (ou alors ca a été enlevé par souci de lisibilité), et normalement le pb devrait se trouver en un rien de temps avec les WSAGetLastError(). Bon je sais bien qu'en udp c pas trop fiable, mais ca fait jamais de mal d'etre un minimum propre.

n°379851
xWillow
Posté le 01-05-2003 à 22:09:17  profilanswer
 

oui evidemment la c'est un peu fait en speed aussi

n°379852
Konar
Posté le 01-05-2003 à 22:11:13  profilanswer
 

xWillow a écrit :

oui evidemment la c'est un peu fait en speed aussi


 
ca concerne surtout le gars pour son "telnet"
 
enfin bon, c pas mon pb...

n°379855
xWillow
Posté le 01-05-2003 à 22:12:22  profilanswer
 

ouais :o

n°379859
xWillow
Posté le 01-05-2003 à 22:15:17  profilanswer
 

en fait je peux pas trop savoir quelle est l'erreur parce qu'il manque les sources de l'autre coté de ton programme

n°379870
antsite
Je me souviens
Posté le 01-05-2003 à 22:26:12  profilanswer
 

l'autre coté du prog, "telnet"
 

ANTSite a écrit :


 
cf premier post:
tempaddr.sin_family = AF_INET;  
tempaddr.sin_port = htons(5000);
 
edit: pardon j'avais pas compris ton post, mais alors comment faire pour envoyer à mon client si on ne connait pas le port ?
 
code du client "telnet":
la boucle de réception dans un thread

Code :
  1. while(!stop)
  2. {
  3.  strcpy(buf, "" );
  4.         r = recvfrom(s, buf, sizeof(buf), 0, 0, 0);
  5.  if(r == 0 || r == SOCKET_ERROR)
  6.   break;
  7.  buf[r] = '\0';
  8.         printf("- %s -\n", buf);
  9. }
  10. closesocket(s);


le main:
 

Code :
  1. s = socket(AF_INET, SOCK_DGRAM, 0);
  2. localaddr.sin_family = AF_INET;
  3. localaddr.sin_addr = inet_addr("192.168.0.1" );
  4. localaddr.sin_port = htons(5000);
  5. bind(s, (LPSOCKADDR)&localaddr, sizeof(localaddr));
  6. size = sizeof(localaddr);
  7. while(1)
  8. {
  9.         strcpy(in, "" );
  10.         gets(in);
  11.        
  12.         if(strcmp(in, "q" ) == 0) break;
  13.         else
  14.         {
  15.             printf("+ %s +\n", in);
  16.             sendto(s, in, sizeof(in), 0, (LPSOCKADDR)&localaddr, size);
  17.         }
  18. fflush(stdin);
  19. }




 
alors les 3 sources ci dessus sont compilées mais:
les 3 commencent par un recvfrom,c bizarre non ? surtout que je comprends pas pourquoi ces recvfrom ne sont pas bloquants car quand je lance les exe ben ça bloque pas...


Message édité par antsite le 01-05-2003 à 22:27:29
n°379874
xWillow
Posté le 01-05-2003 à 22:30:13  profilanswer
 

en fait c'est clair que si tu espere recevoir sur le meme port que celui ou tu envois, c'est pas gagné
comme tu fais un blabla.sin_port = htons(5000);
apres tu fait ton bind sur blabla et apres tu send avec blabla, donc tu esperes recevoir sur blabla ?
euh, si ca block pas sur mon code c'est juste parce qu'il recoit les messages.

n°379876
Konar
Posté le 01-05-2003 à 22:30:36  profilanswer
 

ANTSite a écrit :


les 3 commencent par un recvfrom,c bizarre non ? surtout que je comprends pas pourquoi ces recvfrom ne sont pas bloquants car quand je lance les exe ben ça bloque pas...


 
un conseil : man select
 
tu trouveras aussi qq reponses a ce sujet sur des posts recents...

n°379877
xWillow
Posté le 01-05-2003 à 22:31:05  profilanswer
 

il faut que tu lances 3 et 1, qui vont etre bloqué, ensuite tu lances 2 qui va debloqué 1 qui va debloqué 3 et redebloqué 2.


Message édité par xWillow le 01-05-2003 à 22:31:23
n°379880
xWillow
Posté le 01-05-2003 à 22:35:33  profilanswer
 

ahaha quelle gros boulet =)
je me suis gourré attend, j'ai mis deux fois le 1.c en copiant collant et fait chier j'ai effacer les sources chez moi, ahah je me suis bien depouiller pour rien, je pense juste que pour que ca marche tu dois separer les sockaddr_in


Message édité par xWillow le 01-05-2003 à 22:36:24
n°379882
CtHuLhU50
Posté le 01-05-2003 à 22:38:00  profilanswer
 

oui oui chez moi ca a l air de marcher !

n°379886
antsite
Je me souviens
Posté le 01-05-2003 à 22:52:14  profilanswer
 

Bon donc je vais recoder mon client (mon serveur étant identique à l'exemple donné à savoir 1.c. Je reposterai en cas de problèmes, merci de votre aide  :hello:

n°379972
Deaddy
Posté le 02-05-2003 à 00:28:53  profilanswer
 

bouhlala ca patauge les gars !
 
j'ai pas tout lu, mais une indication: j'ai déjà vu des gens ayant des pb avec la lib ws_s32.lib (ou un nom qui ressemble); perso j'utilise wsock32.lib
 
résumé: en udp, pas besoin de connect; un bind pour chaque socket voulant recevoir des infos sur un port défini; et pour envoyer à plusieurs ip avec le meme socket, il suffit de changer les infos contenu dans le sockaddr avant l'envoi (le sendto)

n°380122
CtHuLhU50
Posté le 02-05-2003 à 08:59:01  profilanswer
 

ok c'est bien ce que je pensais mais alors donc imaginons que se soit un chat sur internet en udp oui je sais, c'est cons mais c'est un example !
 
et ke la machine client soit derriere une passerelle, le blind ne marchera donc plus car il va ouvrir la port udp de la machine derriere la passerelle(machine client), qui n'est pas en communication directement avec internet.Le chat ne pourra donc pas marcher non ?
 
Pour que le chat marche on sera obliger de forwarder le port udp utilisé par le chat sur la machine client interne au reseau local !
 
Donc une question me viens comment fond les jeux style CS ou unreal ... pour que k on puisse jouer derriere une passerelle sans forwarder le port ?
 
merci

n°380259
mrbebert
Posté le 02-05-2003 à 11:12:48  profilanswer
 

C'est une bonne question [:figti]  
 
A mon avis, le routeur mémorise les derniers échanges. Si un des PC a envoyé un paquet UDP à un serveur, le routeur va automatiquement rerouté les paquets UDP provenant de ce serveur vers le client.
Se pose le problème de la présence de plusieurs clients sur le réseau local [:gratgrat]
 
C'est juste une hypothèse. En fait, j'en sais rien :D  
 
Pour les jeux, c'est plutot du TCP qui est utilisé :)

n°380273
Konar
Posté le 02-05-2003 à 11:26:05  profilanswer
 

mrBebert a écrit :

C'est une bonne question [:figti]  
 
A mon avis, le routeur mémorise les derniers échanges. Si un des PC a envoyé un paquet UDP à un serveur, le routeur va automatiquement rerouté les paquets UDP provenant de ce serveur vers le client.


 
sans oublier aussi les paquets bloqués dans les cables...

n°380313
xWillow
Posté le 02-05-2003 à 12:24:46  profilanswer
 

ouais, quand y a des noeuds dans les cables :)

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[PHP]Probleme d'execution de script avec Easy Phpprobleme avec une boucle
[ Python ] problème libftp [ resolu ][C] Probleme d'édition de lien
problème avec la mise à jour de données en VB avec ADO[ Python ] Problème avec Tkinter
Pitit probleme de selection (UP prob 2)Problème d'activeX = Comdlg32.ocx
problème avec tomcat[C]probleme de if for
Plus de sujets relatifs à : [C/C++] Sockets en UDP, problème d'envoi à une IP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR