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

 


Dernière réponse
Sujet : [C++] Sockets : Problème serveur
antsite C'était tout simplement une variable non initialisée qui faisait tout planter.
Merci

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
antsite C'était tout simplement une variable non initialisée qui faisait tout planter.
Merci
altac 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 ?
antsite 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() ?
altac 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 ?
antsite 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() ?
altac 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 ...
youdontcare - 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.
antsite Ben j'aimerais bien qu'on m'explique ce qu'apportent les sockets async en plus ?
youdontcare 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)
antsite 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);

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