Probleme Socket sur un Tchat

Résolu
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010 - 10 juin 2010 à 20:13
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010 - 4 juil. 2010 à 13:23
Bien le Bonsoir a toutes et a tous .

Programmeur en Delphi depuis pas très longtemps (mais ayant quand même les bases) (Enfin je pense xD ^^ )

Je me suis mis a l'idée de crée un Programme serveur/Client grâce aux Socket, que j'ai réussis !

Comme j'ai réussis mon opération, je me suis dit que faire un Tchat serai autant possible.

Mais lorsque je le test avec un ami, une erreur survient !

(Vous allez me dire que j'ai qu'a tapé le nom de l'erreur chez notre ami google, ce que j'ai fait. J'ai eu explication, mais pas moyen de réparation...

Donc mon Joli code d'erreur :
" Erreur Socket 10060" --> Time out



Voiçi Mon code : (Je n'ai pas rajouté les OnError sur le client, ni sur le serveur)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Label1: TLabel;
    GroupBox2: TGroupBox;
    Label2: TLabel;
    Edit2: TEdit;
    Button2: TButton;
    Button3: TButton;
    GroupBox3: TGroupBox;
    Memo1: TMemo;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    Button4: TButton;
    Edit3: TEdit;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure OnListen(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure OnConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure OnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button5Click(Sender: TObject);
    procedure FermetureForm(Sender: TObject; var Action: TCloseAction);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Port:=StrToInt(edit1.text);
ServerSocket1.Open ;
Memo1.Lines.add('Votre Port a était ouvert!');

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ServerSocket1.Close ;
Memo1.Lines.Add('Votre port a était fermé!')  ;
end;

procedure TForm1.OnClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Memo1.Lines.add('Votre Contact c"est connecté ');
end;

procedure TForm1.OnClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Memo1.Lines.add('Votre Contact s"est déconnecté ');
end;

procedure TForm1.OnListen(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.add('Vous êtes près a reçevoir');
end;

procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.add('LUI : ' + Socket.ReceiveText + ' ');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Host:=edit2.Text ;
ClientSocket1.Port:=StrToInt(edit1.text);
ClientSocket1.Open ;
Memo1.Lines.add('Vous vous connecté a ' + edit2.text);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Close;
Memo1.Lines.add('Vous vous déconnecté de ' + edit2.text);
end;

procedure TForm1.OnConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.add('Vous vous connectez à ' + edit2.Text );
end;


procedure TForm1.OnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.add('Vous vous êtes déconnecté de ' + edit2.text );
end;


procedure TForm1.Button5Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(edit3.Text)  ;
Memo1.Lines.add('MOI : ' + edit3.text) ;
end;

procedure TForm1.FermetureForm(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Close;
ServerSocket1.Close;
end;

end.


Donc si quelqu'un pourrai m'aider ce serai super sympa =)
Merci pour vos futur réponse <3

31 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
12 juin 2010 à 02:17
Salut,
en général moi j'utilise directement les API Winsock, qui donnent un contrôle total sur tout ce que tu fais (mais faut de la doc). Ou alors j'utilise les composants Indy (faut de la doc aussi xD). Les composants TServer/ClientSocket ont été déclarés mauvais par Borland et ne sont pas recommandés à l'utilisation. Mais bon, si c'est juste pour un chat je suis sûr que c'est utilisable ...

Je ne vois plus trop d'où peut venir le problème, alors je te propose d'upload tout ton projet sur un hébergeur (genre rapidshare) que l'on puisse le télécharger et tenter de reproduire l'erreur avec un ami afin de débugger. Car même si j'ai le code plus haut, je n'ai pas le DFM et je ne peux donc compiler.

Cordialement, Bacterius !
3
Utilisateur anonyme
4 juil. 2010 à 13:19
c'est que globalement, moi, dans un TButton je mélange Client et Serveur . Tandis que toi,

chaque Tbutton a un rôle, soit le client, soit le serveur.
Si avant ca marchait pas et que maintenant ca fonctionne, je te laisse conclure toi même à ta question
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
11 juin 2010 à 06:15
Salut,
désolé si je manque de précision, je n'utilise plus ces composants depuis longtemps, mais as-tu essayé de passer la propriété Active des sockets à True ? Aussi, quel port utilises-tu ? Il ne faut pas utiliser ceux en dessous de 1025 qui sont utilisés par Windows. De plus, si toi ou ton ami possède un routeur ou autre périphérique un peu spécial, il faut spécifiquement ouvrir les ports concernés chez celui qui bind (qui attend la connexion de l'autre).

Tu peux te débarrasser du TServerSocket, qui est peut-être à l'origine de l'erreur (double utilisation du port, si ce sont les mêmes), en essayant de te connecter à lui quand-même (ou vice-versa). Si l'un de vous n'a pas bind, ça échouera. On fait comme ça avec un ami, et je trouve plus simple et moins risqué de passer par un seul socket et de vérifier notre présence via MSN plutôt que d'utiliser deux sockets, un pour bind l'autre pour se connecter.

Remarque : je ne crois pas que ces composants prennent en charge la résolution DNS des adresses IP, donc il te faut entrer l'adresse IP de ton ami (il peut la vérifier sur www.whatismyip.com par exemple).

Comme tu le vois, beaucoup d'erreurs possibles, eh oui le réseau c'est beaucoup de lecture et beaucoup de débuggage , n'hésites pas à répondre pour plus d'informations.

Cordialement, Bacterius !
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
11 juin 2010 à 14:22
Merci bien de m'avoir répondu Bacterius !

Dans mon post, j'ai oublié de précisé que par MSN, nous nous donnons nos IP, et pour les ports, nous ouvrons tout les 2 ouvert le même port ( le 1080 )

Ensuite pour le routeur , pile avant (avec le même codage) j'ai juste fait l'application CLIENT/SERVEUR , Le client peut juste envoyé, et le serveur juste recevoir, et lorsque je l'ai essayé (avec le même ami) je n'ai pas eu ce problème, Donc je doute que le(s) routeur(s) sont a l'origine du problème !

Tu m'as dit que tu n'utilises plus ces composants, tu utilises quoi d'autre pour ce genre de programme ?

(et si tu as d'autre réponse pour mon problème, n'hésite pas a me les dire =) )

merci déjà Pour ta réponse
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
12 juin 2010 à 17:48
Encore merci de m'avoir répondu Bacterius !

Les API de winsock, je connais un peux avec Visual basic 2008 (.net) , par contre les composants Yndy j'en ai jamais entendu parlé ! Je vais allez me renseigné la dessus !

Mais je doit avoué que je préfère réglé mon problème en delphi parce que c'est assez frustrant ^^

Voila le projet que j'ai uploadé sur MegaUplaod :

http://www.megaupload.com/?d=F5JSOWT3

Merci de m'aider
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
12 juin 2010 à 18:34
Salut,
j'ai modifié le code sensiblement :

procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Port:=StrtoInt(Edit1.Text);
ServerSocket1.Active := True;
Label2.Enabled := True ;
Edit2.Enabled := True ;
Button2.Enabled := True  ;
Button3.Enabled := True ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Port:=StrToInt(Edit1.Text);
ClientSocket1.Address:=Edit2.Text ;
ClientSocket1.Open;
end;


Je n'ai pas pu tester réellement car je n'avais pas de pote/machine dispo à ce moment, en revanche j'ai pu me connecter en localhost sans problème. Peux-tu mettre à jour le code, essayer de te connecter sur le port 8412 (choisi au pif, rien de spécial à propos de ce port ^^), sur l'adresse "127.0.0.1", et me dire si tu arrives à te connecter à ta propre machine et si tu reçois un écho de ce que tu dis ?


Cordialement, Bacterius !
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
12 juin 2010 à 18:43
J'avais testé moi aussi en local , tout marche bien !
(et pour les petites modif c'est gentil =) )

Mais dès que je l'envoi a mon ami, ça ne marche plus
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
12 juin 2010 à 19:00
Salut,
étrange. Je vais tenter de remédier à ça quand je serai revenu (je dois m'absenter quelques heures, désolé). Il doit y avoir une explication simple ...

Cordialement, Bacterius !
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
13 juin 2010 à 12:13
Oui surement, je suis encore assez débutant '-_- ^^

Merci encore de m'aidais, j'attends ton prochain post avec impatience !
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
14 juin 2010 à 20:14
En tout cas le temps que Bacterius reviens, si vous quelqu'un d'autre peux venir m'aidai, ce n'est pas de refus =)
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
15 juin 2010 à 20:09
C'est dommage que seul bacterius m'aide =( Je pense pas que je suis le seul a avoir ou a avoir eu ce problème ^^
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
17 juin 2010 à 22:31
Toujours pas ?
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
18 juin 2010 à 20:22
J'ai l'impression de faire un monologue xD !

Suis je seul au monde ?
0
waste49 Messages postés 7 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 18 février 2014
20 juin 2010 à 11:47
heuu , salut à toi , j'aimerais bien mais j'utilise pas tserversocket car j'ai pas réussi à les mettre sous delphi 2010 ,ça c'est pour delphi7
j'utilise les composants indy , idtcpserver et idtcpclient,

j'ai essayé les ttcpclient , ttcpserver ,qui sont livrés avec 2010 , et j'ai seulement réussi à avoir une connexion coherente avec indy ,

je suis votre discussion car ça m'interresse aussi , si vous avez de la doc sur comment utiliser l'api winsock directement , j'ai trouvé des codes bien sur mais pas de doc official , pareil sur les indy je tatonne j'avance pas c'est enervant ,
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
20 juin 2010 à 17:52
Salut a toi waste !

Perso acec les TserverSocket et TCLient , j'avais bien avancé ! (jusqu'à maintenant) ^^

Pour les Indy, j'ai trouvé quelque tutoriel qui m'ont intéressé ! Mais je regarderai que quand j'aurai ma solution de mon problème d'en ce moment ^^ Je suis têtu comme une mule !

Ensuite, pour le winsock, j'ai testé de l'utilisé en vb.net , j'ai a moitié réussi ^^ (mais ne parlons pas de Vb chez les delphiniste ^^)

Donc si Bacterius, ou autre "Pro" du Delphi, pourrai nous venir en aide, ce serai pas mal =)
0
Utilisateur anonyme
20 juin 2010 à 23:37
Pour les API winsock, tout est expliqué dans la MSDN et il y a un exemple ici
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
21 juin 2010 à 13:35
C-est gentil de nous répondre Francky , mais tu n'aurai pas plutôt une solution pour le probleme de départ ?
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
21 juin 2010 à 19:37
Je vais devoir m'absanté une petite semaine, j'espère qu'a mon retour j'aurai mes réponses =)

Bonne semaine a mes sauveurs =p
0
Utilisateur anonyme
22 juin 2010 à 02:59
Hey Mister : t'espère avoir tes réponses. T'es un peu cavalier là : doucement hein .

Ta question elle a été posée 500 fois : A toi de chercher ce qui ne va pas.
0
bigbrother26 Messages postés 35 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 4 juillet 2010
26 juin 2010 à 14:56
Cavalier, moi jamais ^^

Nan mais sans déconné, chercher c'est simple !
Mais tout ce que j'ai trouvé c'est la DÉFINITION de mon erreur, et non pas la solution à cette erreur.

Et je pense que si je n'aurai pas assez cherché, je ne posterai pas une dizaine de message sur ce sujet.

Et je suis toujours bloqué
0
Rejoignez-nous