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

 


Dernière réponse
Sujet : [C++] Pourquoi send() des fonctions socket ne marche qu'une seule fois
Harkonnen

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:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Harkonnen

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:

antsite 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,...
AGA :up:
 
moi le send ne marche qu'une fois
Amadeus 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]

antsite Ben alors comment je donne l'ip du serveur et le port au client si c'est pas avec ce petit bout de code ?
XuTi 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...
Amadeus 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+
antsite 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
XuTi mets en ligne ton source...
parce que la je ne peux t aider...
Amadeus 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 ?



MarKuSnoel Mais a quoi servent les fonctions flush et fflush ???
brascoo je me corrige car j'ecris vraiment comme c.. :
 
Normalement non, tu n'es pas obligé de gérer de buffer en C.
brascoo je me corrige car j'ecrit vraiment comme c.. :
 
Normalement non, tu n'es pas obligé de gérer de buffer en C.
brascoo normalement non, tu n'ai pas oblige de gerer de buffer en C.
MarKuSnoel y'aurait-il pas un buffer a vider qq part ???
brascoo 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
antsite Pourquoi send() des fonctions socket ne marche qu'une seule fois de suite sans déconnecter ?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)