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!!