Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : TidTCP et synchronisation de threads [ Réseau & Internet / Client - Server ] (OcHre)

samedi 26 avril 2008 à 18:18:21 | TidTCP et synchronisation de threads

OcHre

Bonjour,

J'essaye actuellement de coder un serveur Socks 4 avec les composants TidTCPserver et TidClient (Indy 9), et je dois avouer que j'ai pas mal de difficulté pour un projet que je pensais plutot simple au départ. Pour l'instant mon programme fonctionne de cette façon:
 
-Quand un client se connecte au serveur la connexion est stockée dans un tableau de TidPeerthread

-On crée ensuite un thread  qui crée dynamiquement un TidTCPClient, le thread est stocké dans un tableau du type de mon thread

-Quand le serveur socks  reçoit une requête (stockée dans un Tmemorystream)  il envoie sur le serveur cible via le client du thread qu'il a créé

-Quand le client du thread reçoit une réponse (stockée dans un Tmemorystream) du serveur cible il l'envoie au client  via le thread du serveur

Evidemment ca ne marche pas, j'arrive à avoir une page html correctement si celle-ci a un contenu simple mais dés qu'il y a trop d'images ou de liens vers d'autres serveurs il y a énormement de pertes de données (ou de connexions qui ne se font pas), idem apres avoir deux ou trois pages html même simples. Suite à ça je me pose quelques questions:

Est-ce que le problème vient du fait qu'il y a pas mal de threads qui communiquent entre eux?  Et dans ce cas est-que je dois utiliser les sémaphores ou un TThreadList?  Voila comment ca se pass coté serveur:


procedure TForm1.serverExecute(AThread: TIdPeerThread);
var
TailleBuffer:integer;
begin
try
taillebuffer:=athread.Connection.ReadFromStack(false,5000,true);
 if (taillebuffer>0) and (TabClient[athread.connection.tag]<>nil) then
 begin
  athread.connection.Readstream(Tabstream[athread.connection.tag],taillebuffer,false);

  section.Enter;       //<--- section est de type  TCriticalSection
  TabClient[athread.connection.tag].client.writestream(Tabstream[athread.connection.tag]); //<-- TabClient est le tableau  de threads
  section.leave;
  Tabstream[athread.connection.tag].Clear;
  sleep(500);
 end;
except
  section.Leave;
end;
end;

Et coté client:

procedure TClientThread.Execute;
var
taillebuffer:integer;
begin
 repeat
    try
    taillebuffer:=client.ReadFromStack(false,2000,true);
     if (taillebuffer>0) and (Form1.TabConnex[mntag]<>nil) then
     begin
      client.readstream(mnstream,taillebuffer,false);
      section.enter

      Form1.TabConnex[mntag].Connection.Writestream(mnstream);  //<-- Tabconnex est le tableau contenant les threads du serveur
      section.leave
      mnstream.Clear;
      sleep(500);
     end;
    except
     client.DisconnectSocket;
    end;
 until (client.Connected=false);
end;

 J'espère avoir été assez clair, merci.


Rions un peu en attendant la mort.




Cette discussion est classé dans : connection, serveur, client, athread, taillebuffer


Répondre à ce message

Sujets en rapport avec ce message

Connection Clients / Serveur [ par isnotgood ] Bonjour à tous, Nous avons un serveur qui contient un TADOConnection vers une base access. Tous les objets de connexion (TDataSetProvider) sont dans u serveur et client Socket [ par sarlcopib ] salut je suis nassim et je suis un débutant en delphi j'ai apris a faire des connection socket mais le probleme c que la connection <SPAN style="FONT- Les outils de connection Client-Serveur [ par jennybless ] Salut! Ma question paraitra peut être vague. Mais elle est necessaire... J'ai besoinde cette information théorique s'il vous plait.Quelles sont les serveur multiclients [ par mimimou ] J ai l intention d utiliser les composants ICS pour reprogrammer un soft multiclients-serveur de zero car les precedentes versions de mon soft comport La connexion entre Serveur client , ça donne rien [ par jackalunion ] Bonjour J'ai mis en place un serveur qui a pour adresse IP: 127.0.0.0 et le port: 3030. Pour tester la connexion.Le Serveur: Indy 10 : Problème fermeture serveur avec client connecté (à caus thread) [ par FGail ] Bonjour,j'ai une petite application client/serveur qui utilise les composants idTCPclient et idTCPserver.J'ai un problème lorsqu'il faut terminer la c Indy 10 / Pb de ReadLn sur une appli Client/Serveur [ par db95 ] Bonsoir a tous. Voila, je developpe une petite appli client serveur sous delphi et j'utilise 2 composant Indy 10 sur ma fiche pour la com (un TIdCmdTc client/serveur [ par tgr74 ] Bonjour à tous, je m'exerce actuellement à developper une application de gestion client/serveur avec Interbase 6 open source comme SGBD. jusqu'a pré


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.