Pourquoi send() des fonctions socket ne marche qu'une seule fois [C++] - Programmation
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
Marsh Posté le 28-05-2001 à 16:59:29
y'aurait-il pas un buffer a vider qq part ???
Marsh Posté le 28-05-2001 à 17:01:55
normalement non, tu n'ai pas oblige de gerer de buffer en C.
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.
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.
Marsh Posté le 28-05-2001 à 17:07:07
Mais a quoi servent les fonctions flush et fflush ???
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 ? |
Marsh Posté le 28-05-2001 à 19:43:30
mets en ligne ton source...
parce que la je ne peux t aider...
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
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+
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...
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 ?
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]
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,...
Marsh Posté le 22-01-2003 à 18:08:42
brascoo a corrigé 3 fois cette phrase : |
Tu peux aussi éditer le message tu sais...
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 ?