IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

probleme de réception de donnée avec TClientSocket sur delphi 6


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut probleme de réception de donnée avec TClientSocket sur delphi 6
    bonjour

    Voila j'ai creé un petit jeu qui peut se jouer a deux en reseau
    J'y ai integré un petit chat pour pouvoir se parler

    J'ai créé un type bacteria qui rassemble toutes les données à transferer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Type
      Tbacteria = Record
            annuler_proposition:boolean;
            accepter:integer;
            proposition:boolean;
            demande_ami_nouvelle_partie:integer;
            nouveau_pseudo :boolean ;
            initialisation:integer;
            af_message:boolean;
            compose:boolean;
            ef_compose:boolean;
            fin_connexion:boolean;
            pseudo:string[13];
            joueur:integer;
            depart:integer;
            messages:string[255];
            couleur:integer;
            cases:tableau;
            joueur_ki_commence:integer;
            serveur_a_gauche:integer;
            p1,p2,p3,p4:integer;
            joue:boolean;
            version:string[5];
            new_couleur_favorite:boolean;
            couleur_favorite:string[20];
       End;
    var
      donnees :Tbacteria;
    et je l'envoi avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if form1.host then Serveur.Socket.Connections[0].SendBuf(donnees,SizeOf(donnees))
        else Client.Socket.SendBuf(donnees,SizeOf(donnees));
    et le recoi avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Recus :=Socket.ReceiveLength;
      If Recus<>SizeOf(donnees) Then Exit;
      Socket.ReceiveBuf(donnees,SizeOf(donnees));
    Et tout ca marche bien enfin presque vu que parfois, le client ou le serveur ne recoit plus rien alors qu'il peut quand meme envoyer
    Donc ba le jeu s'arrete et le chat est a sens unique

    J'ai essayé de faire :
    - avec le serveur je flood volontairement jusqu'a ce que ca se fige (mais ca peut se figer sans flooder )
    - le client fini par se figer
    - le client peut envoyer les messages au serveur
    - le serveur recoit bien le message
    - mais quand j'envoi avec le serveur le client ne recoit rien

    Pour vérifier que c'été le client qui ne recoit pas et non pas le serveur qui n'envoi pas, j'ai modifié le serveur pour qu'il puisse envoyer a deux clients en meme temps.

    Et apres avoir figer le premier client
    Je connecte le deuxieme client au serveur
    Et la si j'envoi un message avec le serveur :
    - le premier client ne recoit toujours rien
    - mais le deuxieme client lui recoi correctement

    Et aussi avec le debuger j'ai pu voir que une fois le client figé, jamais il n'allait dans la procedure "ClientRead"

    Donc ba je ne comprends pas pourquoi le transfert ne se fait plus que dans un sens alors que la conexion est toujours active

    J'ai bien pensé a faire un truk anti-flood mais ca peut aussi arriver sans flooder volontairement en tout cas.
    Je me suis dit que peut etre, c'été une protection de windows pour empecher les attaques mais bon j'aimerais bien que ca marche quand meme lol

    J'espere que certaines personnes auront deja rencontré ce probleme parce que je ne vois pas trop quoi faire :'(

    Merci

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    L'unité Tsocket de Delphi7 corrige quelque problèmes (pas tous hélas) de celle de Delphi6.
    On peut simplement recompiler le source pour l'intégrer à un projet Delphi6.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    re bonjour

    merci d'avoir repondu, j'ai pas trop envie de changer de delphi lol
    C'est quand meme bizarre comme bug, parce que ca couperait la connexion encore, mais ce n'est meme pas le cas pourtant

    Il y a peut etre moyen d'utiliser le composant INDY9 pour faire l'equivalent de Tsocket.
    Enfin je sais pas trop encore comment ca marche avec indy.
    C'est possible que indy me fasse le meme bug ?

    Et lors d'un chat si on flood quel sont cencé etre les conséquences sur le programme si il y en a ?
    (c'est mon premier chat et je suis débutant)

    merci

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Il suffit juste de récupérer le source de Tsocket sans changer de version de Delphi et de l'utiliser en l'insérant dans le projet.

    Mais Indy (que je ne connais pas) est peut-être une meilleure solution.

    Attention, il y a un problème potentiel dans le code : les données peuvent être (théoriquement) reçues en plusieurs receivebuf.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci, euh mais ya des sites ou je peux trouver le source de Tsocket de delphi 7 ?


    Citation Envoyé par Graffito
    les données peuvent être (théoriquement) reçues en plusieurs receivebuf.
    Je ne suis pas sur de comprendre ce que ca veut dire

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Un p'tit exemple : supposons qu'on envoie un paquet de 500 ko par un seul sendbuf, il pourra être reçu en 10 receiveBuf (par paquets de 50ko).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci pour les reponses

    Ba je sais pas faire autrement mais c'est sur que si c'est divisé ca ne doit pas etre tres bon.

    Meme si ca ne doit pas etre a cause de ca que mon programme bug.

    Demain je ne suis pas sur d'avoir beaucoup de temps libre.
    Sinon apres demain je chercherais pour voir si je trouve le source de Tsocket de delphi 7 quelque part, et sinon je regarderais comment marche indy j'pense.

    je tiendrais au courant +++

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    bonjour

    Je n'ai pas trouvé le source de Tsocket de delphi 7

    Mais j'ai refait un chat basic, j'ai utilisé SendText au lieu de SendBuf pour voir.
    Et là je peux flooder ca ne se bloque pas.
    C'est bete je preferais utiliser sendbuf je trouve ca plus simple pour envoyer plusieur données de tout types.
    Mais si j'ai pas le choix au pire ca me laisse une possibilité de resoudre mon probleme.

    J'ai essayé avec indy mais je n'arrive a rien

    Je n'arrive pas a établir de connexion et encore moins d'échanger un record
    Pourtant j'ai cherché un peu partout, j'ai vu dans la faq :
    "Comment envoyer des enregistrements (record) entre un client et un serveur ?"
    Mais je ne comprends pas comment faire pour : entre un serveur et un client

    Mais comme de toute facon je ne sais pas etablir de connexion mdrr ca ne sert a rien

    Donc ba a moins que quelqu'un parvient a me faire comprendre l'utilisation de INDY pour échanger des records je pense que je vais devoir me résigner à utiliser des SendText.

    +++

Discussions similaires

  1. probleme de stockage de données avec un ByteArrayOutputStream
    Par nonoRedDevils dans le forum Java ME
    Réponses: 7
    Dernier message: 28/02/2007, 10h56
  2. Réponses: 2
    Dernier message: 06/06/2006, 12h10
  3. Réponses: 4
    Dernier message: 09/05/2006, 08h55
  4. Réponses: 7
    Dernier message: 16/01/2006, 09h23
  5. Réponses: 4
    Dernier message: 02/06/2005, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo