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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    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 confirmé 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
    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.

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    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 confirmé 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
    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.

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    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 confirmé 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
    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).

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