Client/Serveur

Client/Serveur - Delphi/Pascal - Programmation

Marsh Posté le 10-07-2008 à 22:31:22    

Bonjour, depuis qq jours je m'arrache les cheveux sur une application client/serveur que je realise en delphi.
présentation de l'application:
 d'un coté j'ai un programme client a travers lequel on peut se connecter , envoyer des messages , visualiser les fichiers que possede les autres utilisateurs et eventuellement les télécharger.
De l'autre coté j'ai un programme seveur qui dispatch les données vers les utilisateurs suivant les requêtes et les réponses.
mon problème est le suivant: en réseaux local, c-a-d 2 PC connecté en entre eux le programme fonctionne parfaitement,j'ai même connecté une trentaine de clients et aucun bug. mais dès que j'essaie de l'utiliser à travers internet le programme bug lors de l'envoi de flot de données important tels que fichiers ou liste de répertoire alors de l'envoi de messages texte  ne pose aucun problème.
je pense que le souci vient de l'initialisation de mes sockets:
je vous donne l'implémentation des mes classes PSocket et PServer;
 
PSocket=class
Private
       Sock: TSocket;
       FAddr: TSockAddrIn;
       FConnect:Boolean;
       Flong:integer;
 
public
     constructor  Create; overload;
      constructor  Create(csock:TSocket);overload;
      destructor Destroy; override;
      procedure SetAttr(const adr:string;port:integer);
      procedure Activer;
      procedure Close;
      function IsValide:boolean;
      function EnvoiBuf(var Buf; Count: Integer): Integer;
      function RecoiBuf(var Buf; Count: Integer): Integer;
      function EnvoiText(const s: string):Integer;
      function RecoiText:string  ;
      function GetLocalHost: string;
      function GetLocalPort: Integer;
      function GetRemoteHost: string;
      function GetRemoteAddress: string;
      function GetRemotePort: Integer;
      function GetRemoteAddr: TSockAddrIn;
      function GetLocalAddress: string;
      procedure Deconnecter ;
end;
 
procedure Startup;
begin
     WSAStartup(MAKEWORD(2,0), WSAData);
end;
procedure Cleanup;
begin
   WSACleanup;
end;
 
      constructor PSocket.Create;
       begin
        inherited Create;
        Startup;
        sock:=0;
        FConnect:=false;
 
       end;
 
procedure PSocket.SetAttr(const adr: string;port:integer );
begin
        FAddr.sin_family := AF_INET;
        FAddr.sin_addr.s_addr := inet_addr(PChar(adr));
        FAddr.sin_port := htons(port);
end;
procedure PSocket.Activer();
var
   tmp:integer;
begin
        if FConnect then
        deconnecter ;
        sock:=socket(PF_INET, SOCK_STREAM, 0);
        tmp:=winsock.connect(sock,FAddr,SizeOf(FAddr));
        if tmp=0 then
        if(sock<>INVALID_SOCKET) then
         OnConnect;//pointeur sur fonction
        FConnect:=True;
         
end;
 
destructor PSocket.Destroy;
begin
    closesocket(Sock) ;
    Cleanup;
   inherited destroy;
end;
 
 
-----------------------PSERVer-------------------------------------------------------
 PServer=class
   private
            FSock:TSocket;
            FAddr: TSockAddrIn;
            FConnect:Boolean;
   public
          constructor Create;
          destructor  Destroy;
          procedure   SetAttr(port: integer);
          procedure   Activer;
          function   Accept:PSocket;
          procedure  Listen;
 
end;
 
 constructor PServer.Create;
 begin
        inherited Create;
        Startup;
        Fsock:=0;
        FConnect:=False;
 end;
 
 procedure PServer.SetAttr(port:integer);
 begin
        FAddr.sin_family := AF_INET;
        FAddr.sin_addr.s_addr := INADDR_ANY;
        FAddr.sin_port := htons(port);
 end;
 
 procedure PServer.Activer;
 begin
        if FConnect then
        deconnecter ;
        Fsock:=socket(AF_INET, SOCK_STREAM, 0);
        bind(Fsock, FAddr, SizeOf(FAddr));
        Winsock.listen(FSock,5) ;
        FConnect:=True;
       
 end;
 
ce serai sympa si qq1 pouvai m'aider!!

Reply

Marsh Posté le 10-07-2008 à 22:31:22   

Reply

Sujets relatifs:

Leave a Replay

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