[C++] Pourquoi send() des fonctions socket ne marche qu'une seule fois

Pourquoi send() des fonctions socket ne marche qu'une seule fois [C++] - Programmation

Marsh Posté le 28-05-2001 à 16:37:23    

Pourquoi send() des fonctions socket ne marche qu'une seule fois de suite sans déconnecter ?

Reply

Marsh Posté le 28-05-2001 à 16:37:23   

Reply

Marsh Posté le 28-05-2001 à 16:57:50    

Tu te trompe , tu peux utiliser Send autant de fois que tu veux du moment que tu ne te deconnecte pas.
 
A mon avis ca vient de ton code...
 
si tu peux en afficher un bout...
 
Br@scoo

Reply

Marsh Posté le 28-05-2001 à 16:59:29    

y'aurait-il pas un buffer a vider qq part ???


---------------
Vas-y, fonce! Tu sais jamais, sur un malentendu ça peut marcher...
Reply

Marsh Posté le 28-05-2001 à 17:01:55    

normalement non, tu n'ai pas oblige de gerer de buffer en C.

Reply

Marsh Posté le 28-05-2001 à 17:03:11    

je me corrige car j'ecrit vraiment comme c.. :
 
Normalement non, tu n'es pas obligé de gérer de buffer en C.

Reply

Marsh Posté le 28-05-2001 à 17:03:17    

je me corrige car j'ecris vraiment comme c.. :
 
Normalement non, tu n'es pas obligé de gérer de buffer en C.

Reply

Marsh Posté le 28-05-2001 à 17:07:07    

Mais a quoi servent les fonctions flush et fflush ???


---------------
Vas-y, fonce! Tu sais jamais, sur un malentendu ça peut marcher...
Reply

Marsh Posté le 28-05-2001 à 17:52:22    

Antsite ta trouve la soluce au pb sock async ?
 

ANTSite a écrit a écrit :

Pourquoi send() des fonctions socket ne marche qu'une seule fois de suite sans déconnecter ?



Reply

Marsh Posté le 28-05-2001 à 19:43:30    

mets en ligne ton source...
parce que la je ne peux t aider...

Reply

Marsh Posté le 29-05-2001 à 17:46:36    

Voici le bout de code.
WSAStartup a été appelée
 
void envoi(char pse[],char adip[],unsigned short prt)
{
 SOCKET c;
 SOCKADDR_IN to;
 BOOL sortie = FALSE;
 BOOL change = FALSE;
 
 char data[255];
 char tosend[255];
 char move[10];
 char ping[10] = "ping ";
 int n = 0;
 
 do
 {
  c = socket(AF_INET,SOCK_STREAM,0);
  if(c == INVALID_SOCKET)
  {
   printf("Unable to create socket.\n" );
   printf("Press any key to terminate." );
   getch();
   fflush(stdin);
   exit(1);
  }
  else
  {
   change = FALSE;
   n = 0;
 
   to.sin_family = AF_INET;
   to.sin_addr.s_addr = inet_addr(adip); // IP Serveur
   to.sin_port = htons(prt); // Port à utiliser
 
   if (connect(c,(LPSOCKADDR)&to,sizeof(to)) == SOCKET_ERROR)
   {
    printf("Unable to connect server.\n" );
    printf("Press any key to terminate." );
    getch();
    fflush(stdin);
    exit(1);
   }
   
   else // Y a un blem : envoi que la première fois
   { // Il faudrait déconnecter & reconnecter, mais too long on net.
    printf("Connected to %s (%d)\n\n",adip,prt);
    do
    {
     n = 0;
     printf (": " );
     gets(data);
 
     if (strcmp(data,"/end" ) == 0) //quitter
      n = 1;
     
     if (strstr(data,"/change" ) != NULL) // change serveur
      n = 2;  
     
     if (strstr(data,"/name" ) != NULL) //change pseudo (juste pour ce chat)
      n = 3;  
     
     if (strcmp(data,"/info" ) == 0)
      n = 4;
     
     if (strcmp(data,"/test" ) == 0)
      n = 5;
 
     switch(n)
     {
     case 0 : //envoyer data
      strcpy(tosend,pse);
      strcat(tosend,": " );
      strcat(tosend,data);
             
      if (send(c,tosend,sizeof(tosend),0) == SOCKET_ERROR)
       printf("->Failed\n" );
      else
       printf("->Ok\n" );
       //faire un accusé de reception avec recv() et le serveur send("->ok" );
       //->Ok serait l'accusé
      break;
 
     case 1 : //quitter
      strcpy(tosend,"Disconnection of " );
      strcat(tosend,pse);
      send(c,tosend,sizeof(tosend),0);
       
      sortie = TRUE;
      break;
 
     case 2 : //change
      if (sscanf(data,"%s %s %d",move,adip,&prt) == 3)
      {
       strcpy(tosend,"Disconnection of " );
       strcat(tosend,pse);
       strcat(tosend," toward another server." );
       send(c,tosend,sizeof(tosend),0);
       
       shutdown(c,SD_BOTH);
       closesocket(c);
       
       change = TRUE;
      }
      else
       printf("/change IP Port\n\n" );
 
      break;
 
     case 3 : //pseudo
      if (sscanf(data,"%s %s",move,pse) == 2)
       printf("Name changed : %s\n\n",pse);
      else
       printf("/name Name\n\n" );
 
      break;
       
     case 4 : //infos
      system("netstat -a" );
      break;
 
     case 5 : //test
      strcat(ping,adip);
      system(ping);
      break;
 
     default : //erreur
      printf("\nUndefined error.\n" );
      break;
     }
 
    }
    while(sortie != TRUE && change != TRUE);
   }
  }
 }
 while(sortie != TRUE);
 
 shutdown(c,SD_BOTH);
 
 if (closesocket(c) == SOCKET_ERROR)
  printf("Close error.\n" );
   
 WSACleanup();
}
 
Amadeus, j'ai pas réussi async

Reply

Marsh Posté le 29-05-2001 à 17:46:36   

Reply

Marsh Posté le 29-05-2001 à 18:55:12    

jai fais ds le tps une fonction de sock async qui permet de se connecter a un srv, de lui envoyer un msg,... de maniere asynchrone. Je viens de la retrouver mais elle est un peu longue donc jte lenvoies par mail. a priori ca devrait resoudre ton pb.
A+

Reply

Marsh Posté le 29-05-2001 à 20:04:54    

c normal que cela ne fonctionne pas...
ton bout de code est un bout de code d un serveur    
                to.sin_family = AF_INET;
   to.sin_addr.s_addr = inet_addr(adip); // IP Serveur
   to.sin_port = htons(prt); // Port à utiliser
 
mais pour que le serveur fonctionne, il faut que tu attaches la socket avec un bind....
et apres tu peux faire un listen, et apres tu fais un accept pour accepter le dialogue avec des clients...

Reply

Marsh Posté le 30-05-2001 à 09:32:26    

Ben alors comment je donne l'ip du serveur et le port au client si c'est pas avec ce petit bout de code ?

Reply

Marsh Posté le 30-05-2001 à 10:26:25    

Non c bon, ton code est celui d'un client pas d'un serveur, ta donc pas besoin d'un bind et d'un listen et l'ip que tu donnes est celle du serveur distant.
 

ANTSite a écrit a écrit :

Ben alors comment je donne l'ip du serveur et le port au client si c'est pas avec ce petit bout de code ?



 

[edit]--Message édité par Amadeus--[/edit]

Reply

Marsh Posté le 22-01-2003 à 15:42:27    

:up:
 
moi le send ne marche qu'une fois

Reply

Marsh Posté le 22-01-2003 à 17:57:30    

salut,
en tant qu'auteur de ce topic (j'ai presque honte lol), je te rassure que non on peut envoyer autant de fois que l'on veut, send() n'est pas limité! Malheureusement je ne me rappelle plus d'où venait l'erreur pour pouvoir t'aider, dsl.
Pense à bien vider le tampon de réception que tu utilises avec recv, etc,...

Reply

Marsh Posté le 22-01-2003 à 18:08:42    

brascoo a corrigé 3 fois cette phrase :


Normalement non, tu n'es pas obligé de gérer de buffer en C.


 
Tu peux aussi éditer le message tu sais... :sarcastic:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

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