les socket

les socket - C++ - Programmation

Marsh Posté le 12-11-2004 à 17:34:11    

salut je suis nouveau et c'est mon premier post
je debute en c/c++ et je m'essaye a un programme utilisant les socket  
évidemment il ne marche pas et bien sûr je ne comprend pas pourquoi
c'est la raison tres originale pour laquelle je fais ce post
 
Voila le code
Merci d'avance pour votre aide
Petite precision:
le code bloc au niveau du send et ne passe jamais a la ligne suivante
koi kil se passe?????
[cpp]
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#pragma comment (lib, "ws2_32.lib" )
 
void strfill(char *buf, int size, char lettre)
{
 for(int i=0; i<=size; i++)
  buf[i]=lettre;
}
 
 
 
  void main()
{
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2 ,0), &WSAData);
 
 SOCKET my_sock;
 SOCKADDR_IN remote_sin;
 char buffer[256];
 
 my_sock = socket(AF_INET, SOCK_STREAM, 0);
 
 remote_sin.sin_family         = AF_INET;
 remote_sin.sin_addr.s_addr    = inet_addr("213.228.0.62" );
 remote_sin.sin_port           = htons(25);
 
 connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
 
 while(1)
 {
  strfill(buffer, sizeof(buffer),'\0');
     recv(my_sock, buffer, sizeof(buffer), 0);
     printf("%s", &buffer);
 
   gets(buffer);
           /*C'est maintenant que ca bloque*/
    int sent = send(my_sock, buffer, strlen(buffer), 0);
     if(sent==-1)
         printf("Erreur \"send\" n'as pas fonctionné" );
 }
 
 system("pause" );
 
}

Reply

Marsh Posté le 12-11-2004 à 17:34:11   

Reply

Marsh Posté le 12-11-2004 à 17:35:07    

techniquement, c'est du C et du mauvais

Reply

Marsh Posté le 12-11-2004 à 18:18:01    

boost :o

Reply

Marsh Posté le 12-11-2004 à 18:43:18    

certes mais encore...

Reply

Marsh Posté le 12-11-2004 à 19:47:36    

Ca bloque ou ca plante ?


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 12-11-2004 à 20:10:56    

ca bloque,  
Voila j'ai refait et y de passe ca:
je me connecte au serveur OK
le serveur m'envoie un truc
ca l'affiche Ok
J'essye d'envoyer un truc au serveur  
ca bloque  
ni le serveur ni le client ne recoivent rien  
et je ne voit rien apparraitre quand je tape dans la fenetre de l'un ou de l'autre
 
voila les codes
 
LE SERVEUR

Code :
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #pragma comment (lib, "ws2_32.lib" )
  6. void main()
  7. {
  8. char buffer[255];
  9. WSADATA WSAData;
  10. WSAStartup(MAKEWORD(2,0), &WSAData);
  11. SOCKET sock;
  12. SOCKET csock;
  13. SOCKADDR_IN sin;
  14. SOCKADDR_IN csin;
  15. sock = socket(AF_INET, SOCK_STREAM, 0);
  16. sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
  17. sin.sin_family     = AF_INET;
  18. sin.sin_port     = htons(3000);
  19. bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  20. listen(sock, 0);
  21. printf("-=[SERVEUR]=-\n" );
  22. while(1)
  23. {
  24.  int sinsize = sizeof(csin);
  25.  if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
  26.  {
  27.   printf("recu connexion\n" );
  28.            memset(buffer,0,255);
  29.      recv(sock, buffer, sizeof(buffer), 0);
  30.      printf("%s\n", buffer);
  31.      memset(buffer,0,255);
  32.      gets(buffer);
  33.      send(csock,buffer,255,0);
  34.  }
  35. }
  36. }


 
LE CLIENT  

Code :
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #pragma comment (lib, "ws2_32.lib" )
  6. void strfill(char *buf, int size, char lettre)
  7. {
  8. for(int i=0; i<=size; i++)
  9.  buf[i]=lettre;
  10. }
  11.   void main()
  12. {
  13. WSADATA WSAData;
  14. WSAStartup(MAKEWORD(2 ,0), &WSAData);
  15. SOCKET my_sock;
  16. SOCKADDR_IN remote_sin;
  17. SOCKADDR_IN my_sin;
  18. char buffer[256];
  19. my_sock = socket(AF_INET, SOCK_STREAM, 0);
  20. /*Leur SOCKADDR*/
  21. remote_sin.sin_family         = AF_INET;
  22. remote_sin.sin_addr.s_addr    = inet_addr("127.0.0.1" );
  23. remote_sin.sin_port           = htons(3000);
  24. connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
  25. printf("-=[CLIENT]=-\n" );
  26. while(1)
  27. {
  28.  strfill(buffer, sizeof(buffer),'\0');
  29.     recv(my_sock, buffer, sizeof(buffer), 0);
  30.     printf("%s\n", &buffer);
  31.   gets(buffer);
  32.     int sent = send(my_sock, buffer, strlen(buffer), 0);
  33.     if(sent==-1)
  34.         printf("Erreur \"send\" n'as pas fonctionné" );
  35. }
  36. system("pause" );
  37. }

Reply

Marsh Posté le 12-11-2004 à 22:14:14    

logiquement si tu lance le serveur, puis le client, ils attendent chacun que l'autre envoit qq chose, donc forcement ils peuvent attendre longtemps ...  
 
d'autre part une fois tu utilises ta fonction strfill, une fois memset ... pourtant leur role est le meme non ?


Message édité par blackgoddess le 12-11-2004 à 22:14:29

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 13-11-2004 à 11:12:04    

Merci pour l'info BlackGodess
memset je ne savais pas que ca existait (je debute)  
le serveur est un code que j'ai trouvé sur le net et un peu arrangé  
tandis que le client est de moi voila tout
Donc les fonction bloquent tant qu'elle not pas recu quelque chose  
comment y pallier?
j'ai entendu parler de select() mais je ne sais pas vraiment en quoi ca consiste
avez vous un solution??

Reply

Marsh Posté le 13-11-2004 à 12:34:29    

Tu trouveras ce que tu cherches ici :
ftp://ftp1.instit-st-jo.asso.fr/pub/public/CSEcho/
 
Et pour le serveur en version select(), je l'ai également fait récemment mais ça serait bien que tu comprennes un peu ce que tu fais.  
 
Tu fais quelles études ? BTS IRIS ?


Message édité par Master_Jul le 13-11-2004 à 12:35:09

---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 13-11-2004 à 13:21:45    

merci pour le lien Maste_Jul
il a l'air long et compliqué mais si il marche alors c'est parfait  
je vais le regarder....
PS: Si tu veux le savoir je suis en premiere voila
 
Vous allez dire que je commence a etre enervant avec mes sockets foireux mais j'ai encore un question  
au debut je voulais faire un client genre telnet pour envoyer des mails
comme il ne marchait pas j'ai regardé pk avec le serveur et je me suis retrouvé avec un autre erreur logique celle ci
je suis revenu sur mon client mail et je'ai resolu la moitié du probleme  
pour envoyer une chaine au serveur il faut qu'elle soit terminé par \r\n et pas \0 comme les strings normales
apres avoir corrigé ca mon client va un peu plus loin dans la trnsaction puis bloque ....
ca en devient stressant
voila le code:

Code :
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #pragma comment (lib, "ws2_32.lib" )
  6. void strfill(char *buf, int size, char lettre)
  7. {
  8. for(int i=1; i<=size; i++)
  9.  buf[i]=lettre;
  10. }
  11. int strend(char buf[])
  12. {
  13. int i=0;
  14. while(buf[i])
  15. i++;
  16. return(i);
  17. }
  18.   void main()
  19. {
  20. WSADATA WSAData;
  21. WSAStartup(MAKEWORD(2 ,0), &WSAData);
  22. SOCKET my_sock;
  23. SOCKADDR_IN remote_sin;
  24. SOCKADDR_IN my_sin;
  25. char buffer[256];
  26. my_sock = socket(AF_INET, SOCK_STREAM, 0);
  27. /*Leur SOCKADDR*/
  28. remote_sin.sin_family         = AF_INET;
  29. remote_sin.sin_addr.s_addr    = inet_addr("213.228.0.62" );
  30. remote_sin.sin_port           = htons(25);
  31. printf("-=[CLIENT]=-\n" );
  32. connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
  33. while(1)
  34. {
  35.  strfill(buffer, sizeof(buffer),'\0');
  36.     recv(my_sock, buffer, sizeof(buffer), 0);
  37.     printf("%s\n", &buffer);
  38.  gets(buffer);
  39.  int end = strend(buffer);
  40.   buffer[end]= '\r\n';
  41.     int sent = send(my_sock, buffer, strlen(buffer), 0);
  42.     if(sent==-1)
  43.         printf("Erreur \"send\" n'as pas fonctionné" );
  44. }
  45. system("pause" );
  46. }


Qu'ai je donc fait de mal

Reply

Marsh Posté le 13-11-2004 à 13:21:45   

Reply

Marsh Posté le 13-11-2004 à 13:27:27    

utiliser des noms en str<machin> qui sont réservés.
 
strfill étant memset
et strend étant strlen(), et d'ailleurs, tu te plante dans l'index, overflow après
 
'\r\n' <- caractère multioctet, c'est pas bon.
fait un simple strcat(s, "\r\n" );
 
utilise fgets et pas gets
 
 
à propos de to strfill ou de memset  
t'as juste à déclarer ton buffer dans ton for, et de l'initialiser = "" et hop, il est tout plein de zéro

Reply

Marsh Posté le 13-11-2004 à 13:28:21    

PRECISION:
le code bloque quand j'essaye d'envoyer
mail from: blblblblb@free.fr
ou alors j'obtient parfois un message  
555 error qui n'est pas dans le rfc sur smtp
sino tou va bien avant
je me connect()
250 OK postfix gnagnagna
je midentifie
helo bigfotttttt
250 OK
puis soudain
mail from: blablabla
PLUS RIEN OU ERROR 555

Reply

Marsh Posté le 13-11-2004 à 13:29:45    

ho merci merci merci Taz
je vais essayer

Reply

Marsh Posté le 13-11-2004 à 14:20:52    

oui, tout programme marche bien jusqu'a ce qu'il plante...
Grace a l'aide de taz et des autres le client est presque parfait  
il n'y a qu'un hic
on ne peut pas envoyer de messages avec  
en effet tout se passe tres bien jusqu'a ce qu'on tape le corps du message  
la tout se complique et le serveur semble bouder le client
la seule chose que je sois arrivé a faire c'est d'envoyer un mail qui ne qit absoluùment rien c'est a dire completement vide
Encore un fois je fais appel a votre immense generosité  
ce client c'est ma vie....
 
Apres amelioration par Taz

Code :
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #pragma comment (lib, "ws2_32.lib" )
  6.   void main()
  7. {
  8. WSADATA WSAData;
  9. WSAStartup(MAKEWORD(2 ,0), &WSAData);
  10. SOCKET my_sock;
  11. SOCKADDR_IN remote_sin;
  12. SOCKADDR_IN my_sin;
  13. char buffer[256];
  14. my_sock = socket(AF_INET, SOCK_STREAM, 0);
  15. /*Leur SOCKADDR*/
  16. remote_sin.sin_family         = AF_INET;
  17. remote_sin.sin_addr.s_addr    = inet_addr("213.228.0.62" );
  18. remote_sin.sin_port           = htons(25);
  19. printf("-=[CLIENT]=-\n" );
  20. connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
  21. while(1)
  22. {
  23.  memset(buffer, 0, sizeof(buffer));
  24.     recv(my_sock, buffer, sizeof(buffer), 0);
  25.     printf("%s\n", &buffer);
  26.  gets(buffer);
  27.  if(buffer[0]!='s')
  28.  strcat(buffer,"\r\n" );
  29.     int sent = send(my_sock, buffer, strlen(buffer), 0);
  30.     if(sent==-1)
  31.         printf("Erreur \"send\" n'as pas fonctionné" );
  32. }
  33. }


 
PS TAZ fgets je sais pas comment ca marche c tout
sinon j'ai pas tout suivi dans tes explications mais voila a quoi j'ai abouti

Reply

Marsh Posté le 13-11-2004 à 14:28:37    

fgets(buffer, sizeof buffer, stdin);
 
 
printf("%s\n", &buffer);
arghhhhhhhhhhhhhhhh -> puts(buffer);

Reply

Marsh Posté le 13-11-2004 à 14:42:00    

Cher Taz  
pourrais tu etre plus explicite
j'ai fais  
fgets(buffer,sizeof(buffer,stdin))
maintenant j'ai deux fois chaque messages de la part du serveur  
autre point  
que signifie
arghhhhhh-> puts buffer  
puisque t'es toujours la tu me disais quoi avec overflow, mauvais index...
tout a l'heure
merci
je suis peut etre un peu enququinanant
en tout cas merci pour tes conseils qui jusque ici m'ont ete tres utiles
c'est a peu pres tout

Reply

Marsh Posté le 13-11-2004 à 14:49:03    

je t'explique : d'une part t'es bigleux, et d'autre par ton compilateur est une merde sans nom s'il ne t'avertit pas des conneries que tu fais.
 
la solution, c'est relire mon précédent poste, et d'arrêter de faire le con avec les parenthèses

Reply

Marsh Posté le 13-11-2004 à 14:54:50    

je m'a trompé en tapant,
j'ai fait  
fgets(buffer, sizeof(buffer), stdin);
ca marche po^
comme je dis ca fait deux trucs a la reception

Reply

Marsh Posté le 13-11-2004 à 14:56:58    

je crois que j'ai compris le arrgg cetait pour les parentheses oubliées a sizeof(buffer)
Ps ca fait quand meme deux fois le meme message  
KEEP COOL

Reply

Marsh Posté le 13-11-2004 à 15:04:09    

j'ai oubliée aucune parenthèse nulle part

Reply

Marsh Posté le 13-11-2004 à 16:34:31    

maerlin666 a écrit :

oui, tout programme marche bien jusqu'a ce qu'il plante...
Grace a l'aide de taz et des autres le client est presque parfait  
il n'y a qu'un hic
on ne peut pas envoyer de messages avec  
en effet tout se passe tres bien jusqu'a ce qu'on tape le corps du message  
la tout se complique et le serveur semble bouder le client
la seule chose que je sois arrivé a faire c'est d'envoyer un mail qui ne qit absoluùment rien c'est a dire completement vide
Encore un fois je fais appel a votre immense generosité  
ce client c'est ma vie....


En dehors des problèmes liés au code il faudrait s'assurer que tu respectes bien les RFC pour le corps du message. Tu pourrais nous montrer ce que tu envoies au serveur histoire de voir si le problème se situe au niveau de l'envoi des données ou si ce sont les donées elle même qui posent problème...

Reply

Marsh Posté le 13-11-2004 à 19:11:31    

j'envoie des lettres au serveur...
Ex:
Salut,
c'est moi
.
malheuresement ca bloque apres Salut,
le programmae a l'air de fonctionner puisqu'il envoie parfaitement les commandes
mais pour envoyer le corps du message  
 ah
j'ai compris je suis con
comme l'a dit Black Godess
c'est mon recv() qui bloque puisque le serveur ne renvoie rien apres des phrases
contrairement a apres des commandes
bon ben désolé pour tout ce tralala
et merci a tout ceux qui ont répondu
PS: TAZ m'en veux pas si j'ai posé trop de questions :sans rancune?

Reply

Marsh Posté le 13-11-2004 à 20:12:03    

Apres moult' zefforts vous etiez tous impatient de savoir si il s'etait passé
quelque chose
En verité je vous le dis ce programme marche et j'en suis fier (mon premier programme sans gros mot et qui mache)
merci pour votre aide a tous et a la patience de Taz
 
pour ceux que ca interesse voila le code
Bien su qu'evidemment il doit etre un peu grossier pour vous  
dites moi dans ce cas comment je puis l'arranger pour le rendre plus elegant merci
 

Code :
  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #pragma comment (lib, "ws2_32.lib" )
  6.   void main()
  7. {
  8. WSADATA WSAData;
  9. WSAStartup(MAKEWORD(2 ,0), &WSAData);
  10. SOCKET my_sock;
  11. SOCKADDR_IN remote_sin;
  12. SOCKADDR_IN my_sin;
  13. char buffer[256];
  14. my_sock = socket(AF_INET, SOCK_STREAM, 0);
  15. /*Leur SOCKADDR*/
  16. remote_sin.sin_family         = AF_INET;
  17. remote_sin.sin_addr.s_addr    = inet_addr("213.228.0.62" );
  18. remote_sin.sin_port           = htons(25);
  19. printf("-=[CLIENT]=-\n" );
  20. connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
  21. while(1)
  22. {
  23.  int i = recv(my_sock, buffer, sizeof(buffer), 0);
  24.  buffer[i]='\0';
  25.  printf("%s\n", &buffer);
  26.     gets(buffer);
  27.  strcat(buffer,"\r\n" );
  28.  if(buffer[0]=='s')
  29.  break;
  30.  send(my_sock, buffer, strlen(buffer), 0);
  31.  }
  32.     while(1)
  33. {
  34.     send(my_sock, buffer, strlen(buffer), 0);
  35.    gets(buffer);
  36.    strcat(buffer,"\r\n" );
  37.    if(buffer[0]=='.')
  38.    {
  39.   buffer[1]='\0';
  40.     break;
  41.  }
  42.  }
  43.  strcat(buffer, "\r\n" );
  44.  send(my_sock, buffer, strlen(buffer), 0);
  45.  int i = recv(my_sock, buffer, sizeof(buffer), 0);
  46.  buffer[i]='\0';
  47.  printf("%s\n", buffer);
  48.  printf("QUIT" );
  49.  send(my_sock, "QUIT\n", strlen(buffer), 0);
  50.  system("pause" );
  51. }


 
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#pragma comment (lib, "ws2_32.lib" )
 
 
 
 
  void main()
{
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2 ,0), &WSAData);
 
 SOCKET my_sock;
 SOCKADDR_IN remote_sin;
 SOCKADDR_IN my_sin;
 char buffer[256];
 
 my_sock = socket(AF_INET, SOCK_STREAM, 0);
 
 /*Leur SOCKADDR*/
 
 remote_sin.sin_family         = AF_INET;
 remote_sin.sin_addr.s_addr    = inet_addr("213.228.0.62" );
 remote_sin.sin_port           = htons(25);
 
 printf("-=[CLIENT]=-\n" );
 
 connect(my_sock, (SOCKADDR *)&remote_sin, sizeof(SOCKADDR));
 
 while(1)
 {
  int i = recv(my_sock, buffer, sizeof(buffer), 0);
  buffer[i]='\0';
  printf("%s\n", &buffer);
 
     gets(buffer);
  strcat(buffer,"\r\n" );
 
  if(buffer[0]=='s')
  break;
 
  send(my_sock, buffer, strlen(buffer), 0);
  }
 
 
    while(1)
 {
     send(my_sock, buffer, strlen(buffer), 0);
    gets(buffer);
    strcat(buffer,"\r\n" );
    if(buffer[0]=='.')
    {
   buffer[1]='\0';
     break;
  }
  }
 
  strcat(buffer, "\r\n" );
  send(my_sock, buffer, strlen(buffer), 0);
  int i = recv(my_sock, buffer, sizeof(buffer), 0);
  buffer[i]='\0';
  printf("%s\n", buffer);
  printf("QUIT" );
  send(my_sock, "QUIT\n", strlen(buffer), 0);
  system("pause" );
 
}

Reply

Marsh Posté le 13-11-2004 à 20:15:26    

Comment t'envoies un "mail" avec ça ?


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 13-11-2004 à 20:15:30    

tu ferais mieux de faire char buffer[1024 * 1024] parce que sinon, on c'est jamais ce qui peut se passer si on rentre trop de caractères avec ton gets

Reply

Marsh Posté le 13-11-2004 à 23:03:08    

y parait que le prog ne marche pas sur d'autres ordi
d'ou ca peut venir ?
il marche chez vous
????

Reply

Marsh Posté le 14-11-2004 à 10:43:28    

Ca veut dire quoi ça ne marche pas? Le programme ne se lance pas? Il n'arrive pas à se connecter au serveur messagerie?
Il est possible (voire même très probable) que le serveur SMTP que tu indiques en dur dans ton programme refuse l'accès aux abonnés autres que Free.

Reply

Marsh Posté le 14-11-2004 à 13:29:34    

oui c sa il refuse la connection !
y a t il un serveur qui accepte t le monde et qui soit anonyme?

Reply

Marsh Posté le 14-11-2004 à 13:31:47    

crée le toi même
 
Attention à la dérive, ça commence à ressembler à du spamming

Reply

Marsh Posté le 14-11-2004 à 15:35:06    

maerlin666 a écrit :

oui c sa il refuse la connection !
y a t il un serveur qui accepte t le monde et qui soit anonyme?


Le plus simple si c'est pour envoyer des mails par un serveur SMTP ce serait que ton programme prenne en argument le nom d'un serveur, comme ça chaque personne qui voudrait lancer ton programme rajouterait en argument le serveur SMTP de son provider: programme.exe smtp.free.fr
Par contre comme le signal Taz attention de ne pas tomber dans le spamming, c'est mal  :non:


---------------
Reality is that which, when you stop believing in it, doesn't go away.
Reply

Marsh Posté le 19-11-2004 à 18:38:08    

suivant vos bon conseil j'essaye de rajouter un gethostbyname a mon client mais je me heurte a des difficultés imprevues
J'ai fait
hostent* h;
h = gethostbyname("smtp.free.fr" );
r_sin.sin_addr = h->h_addr;
mais pouet ca marche pas  
il faut convertir en u long (si j'ai bien compris le compilateur)
J'ai quelques questions:
c'est quoi cette struct hostent*
j'ai pas trop compris de quoi elle etait faite
les ** c'est des tableauX? aplusieurs dimension?
h__addr pk c'est du char*?
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed