[Borland] Client déconnecté = serveur :asyncronous socket error 10053

Client déconnecté = serveur :asyncronous socket error 10053 [Borland] - C++ - Programmation

Marsh Posté le 05-12-2003 à 20:32:04    

bon ,depuis deux jours que je suis a fond sur mon projet et j'ai encore une merde mais celle la je sais pas d'ou elle vient du tout.
 
l'appli est un chat comportant 2 exec : client et serveur
c'est en travaux donc y aura ptet des commentaires qui servent a rien ou des lignes de debug ou du code en commentaire, c le bordel quoi.
 
mon problème survient lorsque le client se deconnecte, j'ai le serveur qui plante et borland m'affiche "asyncronous socket error 10053".
 
alors si vous pouvez m'aider hésirez pas :) Merci
 
(Code trop volumineux, on va faire autrement que de l'afficher)


Message édité par jeoff le 05-12-2003 à 20:47:04
Reply

Marsh Posté le 05-12-2003 à 20:32:04   

Reply

Marsh Posté le 05-12-2003 à 20:36:51    

jeoff a écrit :


mon problème survient lorsque le client se deconnecte, j'ai le serveur qui plante et borland m'affiche "asyncronous socket error 10053".
 


 
Balancer tout ton code comme ça ne servira pas à grand chose je pense.
 
Winsock error 10053 =  Software Caused Connection Abort -- A connection was aborted by software on the host computer.
 
Ça vient peut-être de la manière dont tu te déconnectes... Sinon y a tj moyen de gérer proprement les erreurs hein :o


Message édité par antp le 05-12-2003 à 20:37:52

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-12-2003 à 20:41:00    

ouais je suis d'accord sur ce que tu dit mais disons que ca marchait très bien jusq' il y a 15 min et d'un coup plus moyen de déco sans planter le serv alors si t'as une astuce pour un débug genre tracer le soft dans le cpp je prens car en c je sais faire mais en c++ je dépasse pas les fenetre avec les try,catch ou celle du code asm si tu voit de quoi je veux parler


Message édité par jeoff le 05-12-2003 à 20:41:23
Reply

Marsh Posté le 05-12-2003 à 20:44:29    

jeoff a écrit :

mais en c++ je dépasse pas les fenetre avec les try,catch ou celle du code asm si tu voit de quoi je veux parler


 
Non, je ne vois pas trop de quoi tu parles. La ponctuation c'est pas mal pour rendre les phrases plus compréhensibles [:figti].
Il me semble que pour éviter l'affichage automatique des messages d'erreur il faut dans le OnError mettre le code d'erreur à 0 ou quelque chose comme ça. Ils en parlent sûrement dans la doc (à moins que je confonde avec les composants Indy ?).
Quand tu dis que le serveur "plante", il plante comment ?


Message édité par antp le 05-12-2003 à 20:44:44

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-12-2003 à 20:51:36    

bon alors en fait lhistoire du debug, c'est que j'ai trois gros fichier dont :  
serveur.cpp

Code :
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. //---------------------------------------------------------------------------
  5. USEFORM("ChatGeneral1.cpp", Form1);
  6. //---------------------------------------------------------------------------
  7. WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  8. {
  9.         try
  10.         {
  11.                  Application->Initialize();
  12.                  Application->CreateForm(__classid(TForm1), &Form1);
  13.                  Application->Run();
  14.         }
  15.         catch (Exception &exception)
  16.         {
  17.                  Application->ShowException(&exception);
  18.         }
  19.         catch (...)
  20.         {
  21.                  try
  22.                  {
  23.                          throw Exception("" );
  24.                  }
  25.                  catch (Exception &exception)
  26.                  {
  27.                          Application->ShowException(&exception);
  28.                  }
  29.         }
  30.         return 0;
  31. }
  32. //---------------------------------------------------------------------------


et
 
server1.cpp
 

Code :
  1. #include <vcl.h>
  2. #pragma hdrstop
  3. #include "Test.h"
  4. //---------------------------------------------------------------------------
  5. #pragma package(smart_init)
  6. #pragma resource "*.dfm"
  7. TForm1 *Form1;
  8. int boutton=0;
  9. int champsenvoyer=0;
  10. int nbuser=0;
  11. int length=0;
  12. struct utilisateur
  13. {
  14.         AnsiString IP;
  15.         AnsiString Nom;
  16.         TCustomWinSocket* Adresse;
  17. };
  18. struct utilisateur Log[20];
  19. struct message
  20. {
  21.         int Action;
  22.         AnsiString Pseudo;
  23.         AnsiString Texte;
  24. };
  25. struct message Msg;
  26. ...


 
je ne sais pas comment tracer le programme en dehors de server.cpp afin de tracer le programme dans server1.cpp.
je ne sais meme pas si c'est possible d'ailleurs.
 
concernant la deuxième question sur l'erreur exacte j'y retourne pour récolter un max de détails

Reply

Marsh Posté le 05-12-2003 à 20:53:55    

bah soit tu mets un breakpoint quelque part pour qu'il s'arrête, puis tu fais du pas à pas avec F7/F8 (F7 pour rentrer dans les fonctions, F8 pour juste exécuter les fonctions)
Soit tu mets le curseur quelque part dans le code et tu fais "run to cursor" (je ne me souviens jamais de quelle touche c'est, c'est dans le menu Run) et tu attends qu'il arrive à la ligne où est le curseur.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-12-2003 à 21:18:17    

ok merci
 
sinon pour les erreurs que j'ai ben voila une descritpion de toutes les combinaisons que j'ai trouvé:
 
je lance le serv depuis borland et je connec puis déco le client:
Debugger Exception Notification : Project Server.exe raised exception class ESocketError with message 'Asynchronous socket error 10053". Process stopped.Use Step or Run to continue et j'arrive sur la fenetre de server.cpp avec la ligne bleue sur l'accolade :
Application->Run();  
            } <--ici
 
si je demarre le server sous win directement avec l'exec et que mon client se connec puis deco, j'obtient la meme erreur mais je peut continuer et la 2 cas se présentent:
 
soit j'arrête puis redemarre le server (via un bouton marche/arret sur la Form1) et lorsque un client se connecte jobtient l'erreur "List index out of bounds (1)"
 
soit je n'arete pas le server et reco directement le client
jobtient l'erreur
"Windows socket error: une connexion existante a du etre fermée par lhote distant (10054), on API'send'"
 
voila voila
v essayer ta methode pour tracer  
je reviens :D (avec une bonne nouvelle j'espère)
 

Reply

Marsh Posté le 05-12-2003 à 21:21:03    

Pour l'erreur ESocketError, c'est normal qu'il n'affiche pas d'où elle vient, c'est parce que ce n'est pas dans ton code mais dans le code des composants socket, à traiter avec les OnError etc. donc.
Idem pour l'autre erreur Winsock.
Le list index out of bouds, c'est probablement dans ton code, tu dois accéder à un index 1 (2è élément donc) d'une liste alors qu'elle en compte 0 ou 1.


Message édité par antp le 05-12-2003 à 21:21:29

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-12-2003 à 21:36:46    

bon g trouvé d'ou ca vient en fait dans mon evenement  

Code :
  1. void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
  2.       TCustomWinSocket *Socket)


j'ai cette ligne la qui fait planter lors de la déco ce qui est pour le moins bizarre car c'est un evénement sur l'acceptation de la connexion

Code :
  1. ServerSocket1->Socket->Connections[0]->SendBuf(&Msg,sizeof(struct message));


v essayer de creuser ca (je suis sur le net avec 98 et xp avec borland alors c un peu chiant :/)

Reply

Marsh Posté le 05-12-2003 à 22:23:23    

bon en fait g résolu le problème ca plante plus mais j'aimerai avoir votre avis sur la question suivante.
 
en fait comme le code est en travaux, je n'avait rien mis au niveau de

Code :
  1. coté client
  2. void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
  3.       TCustomWinSocket *Socket)


du coup quand on arrive a

Code :
  1. coté serveur
  2. void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
  3.         TCustomWinSocket *Socket)
  4. ...
  5. ServerSocket1->Socket->Connections[0]->SendBuf(&Msg,sizeof(struct message));
  6. ...


 
si le client se déconnecte et bien comme il reste des données dans la socket coté serveur, la déconnexion foire et mon serveur plante.
 
J'ai bon ??? Parce que voila, résoudre un problème c bien joli mais si on a pas d'explication de l'origine exacte du problème, on se replante plus tard devant un cas similaire et ca spa bien. :o
 
EDIT merci a antp pour son aide et le temps qu'il m'a accordé, maintenant je sait tracer un cpp


Message édité par jeoff le 05-12-2003 à 22:28:18
Reply

Marsh Posté le 05-12-2003 à 22:23:23   

Reply

Marsh Posté le 06-12-2003 à 22:12:33    

N'utilise pas ServerSocket1Accept pour envoyer ta structure message à la connexion d'un client mais plutot OnClientConnect qui se declanche des qu'un client se connect c'est mieux.
Ensuite dans ton client il faut que tu code l'evenement OnClose de la form et que tu mettes ClientSocket1->Socket->Close()
 
Dans ce cas l'evenement OnDisconnect va se declancher dans le server et va tous remettre à jour. Par contre si dans le meme instant ton server envoyais quelque chose à ton client effectivement ca plante. Pour eviter se genre de chose, moi j'ai fais un Thread qui s'occupe d'envoyer les données du server vers les clients comme ca le server ne fais que recuperer et il est toujours pres à intervenir quand un client se deco.

Reply

Sujets relatifs:

Leave a Replay

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