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

  FORUM HardWare.fr
  Programmation
  C

  Comment vider les sockets ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment vider les sockets ?

n°774925
alex2423
Posté le 23-06-2004 à 21:53:25  profilanswer
 

j'aimerais bien faire 2 dialoguer un client serveur avec les sockets normal bloquantes. J'arrive a envoyer des données mais au bout d'un moment le fonction send bloque.
 
Malheuresement j'ai vu dans l'aide de send :

Citation :

     
 Si la socket ne dispose pas de la place  suffisante  pour  le  message,
       alors send va bloquer, à moins que la socket ait été configurée en mode
       d'entrées/sorties non-bloquantes auquel cas elle renverra  EAGAIN.   On
       peut utiliser l'appel système select(2) pour vérifier s'il est possible
       d'émettre des données.


 
qu'une sockete dispose d'une quantité de placé  limité. Comment faire avec des sockete bloquante  car je n'ai pas envie de me lancer dans des socket non bloquante.  
 
le client en voie un message  
le serveur repond
le client repond  
le serveur repond  
.....
et ainsi de suite, je n'ai pas besoin de sockete non bloquantes
CLIENT

Code :
  1. #define MAXDATASIZE 200 /* Tampon d'entrée */
  2.               int main(int argc, char *argv[])
  3.               {
  4.               int sockfd, numbytes; 
  5.               //char buf[MAXDATASIZE];
  6.               struct hostent *he;
  7.               struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */
  8.              
  9.               char *buf=NULL;
  10.               rcv.pile    = malloc (MAX_PILE_RECEPTION);
  11.              
  12.              
  13.               if (argc != 2)
  14.               {
  15.                             fprintf(stderr,"usage: client hostname\n" );
  16.                             exit(1);
  17.               }
  18.               printf("\n Etabilssement de la connexion sur le serveur %s\n",argv[1]);
  19.                            
  20.               if ((he=gethostbyname(argv[1])) == NULL)
  21.               {      /* Info de l'hôte */
  22.                             herror("gethostbyname" );
  23.                             exit(1);
  24.               }
  25.              
  26.               if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  27.               {
  28.                             perror("socket" );
  29.                             exit(1);
  30.               }
  31.              
  32.               their_addr.sin_family = AF_INET;      /* host byte order */
  33.               their_addr.sin_port = htons(PORT);    /* short, network byte order */
  34.               their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  35.               bzero(&(their_addr.sin_zero), 8);     /* zero pour le reste de struct */
  36.                            
  37.               if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
  38.               {
  39.                             perror("connect" );
  40.                             exit(1);
  41.               }
  42.               while (j < 4)
  43.               {
  44.                             j++; printf("\n\n\n j == %d\n, strlen(buf) = %d", j, strlen(buf));
  45.                             printf("\n buf : \n %s\n",buf);
  46.                             printf("\n<<----------------------------    envoi      ------------------------------->>\n" );
  47.              
  48.                             if (send(sockfd, buf, strlen(buf), 0) == -1)
  49.                             {
  50.                             perror("send" );
  51.                             }
  52.                            
  53.                            
  54.                             if (buf != NULL) free(buf);
  55.                             buf = malloc (MAXDATASIZE);
  56.                             if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
  57.                             {
  58.                             perror("recv" );
  59.                             exit(1);
  60.                             }
  61.                             buf[numbytes] = '\0';
  62.                             printf("\n\n\n<<----------------------   Reception   ------------------------------->>\n" );
  63.                            
  64.                            
  65.                             if (seg.c_ack == 1 && seg.syn == 1)
  66.                             {
  67.                             printf("\n Connexion reussi avec le serveur (ack=1 & syn=1)\n" );
  68.                            
  69.                            
  70.                             }
  71.                            
  72.               }
  73.              
  74.               close(sockfd);
  75.               return 0;
  76.               }


 
SERVEUR

Code :
  1. //serveur  
  2.               #define MAXDATASIZE 200 /* Tampon d'entrée */
  3.               main()
  4.               {
  5.               int sockfd, new_fd, numbytes;  /* Ecouter sock_fd, nouvelle connection sur new_fd */
  6.               struct sockaddr_in my_addr;    /* Adresse */
  7.               struct sockaddr_in their_addr; /* Adresse du connecté  */
  8.               int sin_size;                               
  9.               //char buf[MAXDATASIZE];
  10.               int j=0;
  11.               rcv.pile    = malloc (MAX_PILE_RECEPTION);
  12.              
  13.               //buffer pour la reception et emmsion des données  
  14.               //allocation faites avec affectation_envoi
  15.               char *buf = NULL;
  16.               int bits=32;
  17.               //char    *entete = malloc ( bits * sizeof (int)+1);
  18.               affectation_position_entete ();
  19.               if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  20.               {
  21.                             perror("\nsocket\n" );
  22.                             exit(1);
  23.               }
  24.              
  25.               my_addr.sin_family = AF_INET;         /* host byte order */
  26.               my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
  27.               my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-remplissage avec mon IP */
  28.               bzero(&(my_addr.sin_zero), 8);        /* zero pour le reste de struct */
  29.              
  30.               if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  31.               {
  32.                             perror("\nbind\n" );
  33.                             exit(1);
  34.               }
  35.               /*
  36.               if( getpeername (sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) ) == -1)
  37.               {
  38.                             perror("\ngetpeername\n" );
  39.                             exit(1);
  40.               }*/
  41.               if (listen(sockfd, BACKLOG) == -1)
  42.               {
  43.                             perror("\nlisten\n" );
  44.                             exit(1);
  45.               }
  46.               fflush(stdout);
  47.              
  48.              
  49.              
  50.              
  51.               printf("\n <---------------------accept---------------------------->\n" );
  52.               sin_size = sizeof(struct sockaddr_in);
  53.               if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
  54.                             {
  55.                             perror("\naccept\n" );
  56.               }
  57.               else
  58.               {
  59.                             printf("\n connexion accept\n" );
  60.               }
  61.                            
  62.              
  63.              
  64.               while(j<5)
  65.               {
  66.                             j++; printf("\n\n\n j == %d\n",j);
  67.                             /* main accept() loop */
  68.                             if (buf != NULL) printf("\nfree de buf\n" );
  69.                             buf = malloc (MAXDATASIZE);
  70.               ;
  71.                             printf("\n<<---------------------------- reception ------------------------------->>\n" );
  72.                             if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1)
  73.                             {
  74.                             perror("\nrecv_serveur\n" );
  75.                             exit(1);
  76.                             }
  77.              
  78.                             buf[numbytes] = '\0';
  79.              
  80.                            
  81.                             affectation_seg(buf);
  82.                             if (seg.c_ack == 0 && seg.syn == 1)
  83.                             {
  84.                             printf("\n\n\n\n<----Debut de connexion---->\n" );
  85.                            
  86.                             printf("\n<<----------------------------    envoi      ------------------------------->>\n" );
  87.                             if (send(new_fd, buf, strlen(buf), 0) == -1)
  88.                             {
  89.                                           perror("send" );
  90.                             }
  91.              
  92.                            
  93.                             }
  94.                             else
  95.                             {
  96.                             if ( !(snd.una.valeur < seg.ack  && seg.ack <= snd.nxt) )
  97.                             {
  98.                                           printf("\n reception du numero d'acquitement incorrect\n envoie d'un ack = 0\n" );
  99.                                           snd.c_ack = 0;
  100.                             }
  101.                             else if ( !(rcv.una.valeur < seg.seq && seg.seq <=rcv.nxt) )
  102.                             {
  103.                                           printf("\n reception du numero de sequence incorrect\n envoie d'un ack = 0\n" );
  104.                                           snd.c_ack = 0;
  105.                             }
  106.                             }
  107.                             fflush(stdout);
  108.                            
  109.               }
  110.               close(new_fd);
  111.              
  112.               }
  113. }


Message édité par alex2423 le 23-06-2004 à 22:30:22
mood
Publicité
Posté le 23-06-2004 à 21:53:25  profilanswer
 

n°774929
schnapsman​n
Zaford Beeblefect
Posté le 23-06-2004 à 22:01:04  profilanswer
 

t'inquiete pas coco, en envoi la socket va bloquer seulement si son buffer interne est plein et ne permet pas de stoquer le nombre d'octets que tu veux envoyer.
 
Si elle bloque pour cause de buffer plein, la pile tcp/ip de ton système va bien finir par réussir à envoyer les données contenues dans le buffer tcp/ip. Et donc send va débloquer quand la socket se sera vidée suffisament pour "envoyer" tes octets.


Message édité par schnapsmann le 23-06-2004 à 22:01:54

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°775023
alex2423
Posté le 23-06-2004 à 23:40:02  profilanswer
 

en plus j'ai l'impression que tu as raison  
 
c'est vraiment bizzare cette histoire  
aupravant quand je voyais a mon dernier send 30 caracteres ca passait et lorsque j'essayé 31, ca passait plus
 
enfin bon la j'ai l'impression que ca fonctionne

n°775026
alex2423
Posté le 23-06-2004 à 23:40:37  profilanswer
 

et au fait tu m'as plus que rassurer quand tu m'as dis ca  
 
merci a toi

n°775029
schnapsman​n
Zaford Beeblefect
Posté le 23-06-2004 à 23:44:04  profilanswer
 

non, a mon avis tu as un bug mais j'ai pas envie de lire le gros paté que tu as posté.
 
passer de 30 à 31 octets, ça ne represente rien.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°775053
alex2423
Posté le 24-06-2004 à 00:00:47  profilanswer
 

schnapsmann a écrit :

non, a mon avis tu as un bug mais j'ai pas envie de lire le gros paté que tu as posté.
 
passer de 30 à 31 octets, ça ne represente rien.


lol je te comprends a moitié  
 
mon gros paté comme tu le dis, je ne l'ai pas assez commenyé pour que ce soit plus lisible  
mais maintenant ca fonctionne  
 
je sais pas pourquoi ....

n°775209
jagstang
Pa Capona ಠ_ಠ
Posté le 24-06-2004 à 09:09:45  profilanswer
 

ça serait une bonne idée de faire des fonctions, ou mieux, une classe.


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°775718
alex2423
Posté le 24-06-2004 à 13:48:06  profilanswer
 

oui la je sais que c'est pas tres propre ce que j'ai fais de mettre les sends et les rcv, y a tellement de calcule a faire autour des recv et des send que j'ai decidé de faire les fonctions apres ...
 
En ce qui concerne les classes, j'avais de mal à visulaiser les objets dans ce que je veux faire ... Et comme je n'aime pas faire du C dans du C++ c'est a dire en faisant presque pas de POO, mon choix c'est fais sur le C


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Comment vider les sockets ?

 

Sujets relatifs
[VBA Excel] - Vider toutes les TextBox d'un UserFormCours sur les sockets ICMP
Problème de sockets[C] Sockets et appel système "select()"
[Delphi] Vider un StringGrid ?vider 1 tableau
[java]Régler le timeout de déconnexion des socketsSockets haut niveau
Vider un buffer cin 
Plus de sujets relatifs à : Comment vider les sockets ?


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