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

  FORUM HardWare.fr
  Programmation

  [C++] Sockets : Problème serveur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Sockets : Problème serveur

n°36750
antsite
Je me souviens
Posté le 03-06-2001 à 11:02:31  profilanswer
 

Ce bout de code d'un serveur ne reçoit qu'un seul message d'un client. Les autres ne sont pas reçus.
Pourriez-vous me dire où est le problème ?
Merci
 
SOCKET s;
SOCKET a;
SOCKADDR_IN localaddr;
WSADATA wsa;
WORD v;
 
char data[255];
 
int cb,r,ca;
unsigned short nport = 1050;
unsigned long *nonbl;
unsigned long ul = 1;
nonbl = &ul;
 
v = MAKEWORD(2,0); // version 2.0 des Windows Sockets
 
if (WSAStartup(v, &wsa) != 0)
{
 printf("Socket initialization error." );
 getch();
 exit(1);
}
else
{
 s = socket(AF_INET,SOCK_STREAM,0);
 if(s == INVALID_SOCKET)
  printf("Unable to create socket." );
 
 else
 {
  localaddr.sin_family = AF_INET;
  localaddr.sin_addr.s_addr = INADDR_ANY;
  localaddr.sin_port = htons(nport);
 
  if (bind(s,(LPSOCKADDR)&localaddr,sizeof(localaddr)) == SOCKET_ERROR)
   printf("Error linking socket-port." );
   
  else
  {
   if (listen(s,5) == SOCKET_ERROR)
    printf("Error listening to socket." );
 
   else
   {
    ioctlsocket(s,FIONBIO,nonbl); //Mode non bloquant
     
    printf("Press any key to stop...\n" );
    do
    {
     a = accept(s,NULL,NULL);
     if (a != INVALID_SOCKET)
     {
      strcpy(data,"" );
             
      r = recv(a,data,sizeof(data),0);
      if (r == SOCKET_ERROR)
      {
       if (GetLastError() == 10035) //Message vide
        printf("/\n" );
       else
        printf("Reception error (%d).\n",GetLastError());
      }
      else
       printf("\n%s\n",data); //Il affiche que le premier message (vide)
     }
     Sleep(500);
    }
    while(!kbhit());
   }
  }
  shutdown(s,SD_BOTH);
  shutdown(a,SD_BOTH);
  cb = closesocket(s);
  ca = closesocket(a);
  WSACleanup();
 }
}
exit(0);

mood
Publicité
Posté le 03-06-2001 à 11:02:31  profilanswer
 

n°36764
youdontcar​e
Posté le 03-06-2001 à 14:20:05  profilanswer
 

t'en peux plus de tes sockets toi !
 
comme te conseillait un gars l'autre jour, fait ça en asynchrone. tu pourras trouver sur http://www.sockaddr.com/ExampleSourceCode.html des sources pour un serveur asynchrone (HTTPa.zip) et un client asynchrone (CheckMail.zip)

n°36785
antsite
Je me souviens
Posté le 03-06-2001 à 20:01:53  profilanswer
 

Ben j'aimerais bien qu'on m'explique ce qu'apportent les sockets async en plus ?

n°36786
youdontcar​e
Posté le 03-06-2001 à 20:11:55  profilanswer
 

- hum ... l'asynchronisme ? :D cad ton application peut faire autre chose pendant qu'elle envoie un gros fichier.
 
- pour cela, tu as des notifications de lecture et d'écriture pour savoir quand envoyer et traiter l'info.
 
- et dans ce cas présent, l'accès à des sources qui marchent.
 
- pour finir, je n'ai jamais fait autre chose que des sockets asynchrones, je suis donc incapable de répondre autrement à ton problème.

n°36809
altac
Posté le 04-06-2001 à 09:39:05  profilanswer
 

mais t'es sur que c'est normal que ton code lance "accept" avant chaque lecture ?
je sais pas exactement ce que tu veux faire mais ca me semble un peut etrange ...
en plus tu ne fermes pas la socket "a" apres l'avoir utilisee ...

n°36811
antsite
Je me souviens
Posté le 04-06-2001 à 10:31:40  profilanswer
 

En effet je viens de me rendre compte que le pb était du à l'appel d'accept() en boucle. Encore merci.
Mais j'ai maintenant un autre problème :
 
Peut-on appeler accept(), recv(), et réappeler accept() sur le même socket une fois recv() achevé ?
Dans mon code, il accepte la 1ère fois, mais pas la 2ème.
Faut-il refermer le socket renvoyé par accept() ?

n°36812
altac
Posté le 04-06-2001 à 10:46:27  profilanswer
 

accept sert a etablir une connexion TCP et la socket retournee va te servir a communiquer a travers cette connexion. Donc avant d'appeller une nouvelle fois accept, il faut fermer la connexion si tu ne veux plus.
je comprends pas pourquoi tu veux appeller accept une nouvelle fois apres recv ?

n°37078
antsite
Je me souviens
Posté le 05-06-2001 à 16:12:09  profilanswer
 

après acccept(), j'ai fais un closesocket() de la socket retournée par accept(), mais le serveur n'accepte plus d'autres clients. Faut-il appeler une autre fonction que closesocket avant de réappeler accept() ?

n°37233
altac
Posté le 06-06-2001 à 03:15:28  profilanswer
 

non, il n'y a pas a appeller d'autres fonctions que closesocket() pour fermer une socket. enfin ca fait longtemps que j'ai pas code de sockets sous win mais je pense pas me tromper ....
qu'est-ce que tu veux dire par "le serveur n'accepte plus d'autres clients" ?
peux-tu nous montrer ton code modifie ?

n°37352
antsite
Je me souviens
Posté le 06-06-2001 à 13:50:06  profilanswer
 

C'était tout simplement une variable non initialisée qui faisait tout planter.
Merci


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

  [C++] Sockets : Problème serveur

 

Sujets relatifs
probleme de javascript sur ma page web[phpBB]Probleme de connection
[C++] Sockets : Problème de clientserveur MySQL sous win2000....
Pb de mise en place d'un site ASP sur un serveur NT ?[ASP] Probleme de passage d'argument
[XSL] petit problème de débutant[HTML/JavaScript/ASP] Problème avec Netscape
[HTML] Un probleme a la con ... 
Plus de sujets relatifs à : [C++] Sockets : Problème serveur


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