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.