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

MFC Discussion :

[MFC] CSocket | perte de données


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut [MFC] CSocket | perte de données
    voilà ma structure :


    Dans l'appli server, j'ai un Socket (une classe Server dérivée de CSocket) qui est en écoute d'un port.

    dans le onAccept, je créé une nouvelle Socket client (une autre classe dérivée toujours de CSocket) qui va servir de dialogue avec le client connecté.

    la Socket Client utilise un CSocketFile, ainsi que 2 CArchive in et out.

    ensuite j'attend avec le OnReceive, j'affiche à l'écran ce que je reçoit, je renvoie OK.




    L'appli client n'utilise que la classe de Socket client, et tente une connexion sur une ip et un port (celle où il y a le serveur, c'est mieux ).
    cette socket est créé sans confirmation (elle ne renvoie pas de message à chaque reception, contrairement au serveur, juste un BOOL dans le constructeur)

    et elle envoie les messages tapés au clavier au serveur.



    ============

    Alors tout se passe bien (j'ai limite un chat avec M. envoyé et M.reçu à l'écran).

    Mais parfois (et assez souvent meme), le client ne reçoit plus rien du serveur avec son premier message (qui est "Connexion effectuée"). En fait, généralement il ne peut qu'envoyer des messages au serveur, qui les reçoit tous, mais lorsque le serveur répond, le client ne reçoit rien.

    Donc quoi qu'il se passe, on a toujours "Connexion effectuée", suivi de la réponse serveur "OK" qui fonctionne dans les deux sens. Après cela, ça devient plus aléatoire, jusqu'à ce que systématiquement, l'un des 2 perdent soit l'envoie, soit la réception...

    Du coup, la connexion est pas stablea ^^


    L'utilisation qui en sera faite est la suivante :
    - serveur attend des connexions de n'importe qui
    - reçoit une connexion et un message (ou plusieurs, j'ai aussi un probleme sur la taille, mais je dialogue avec des vieux ordis comme des VAX)
    - donne une confirmation de récéption au client
    - effectue le calcul demandée
    - envoie la réponse au client
    - recoit le retour du client

    mais si les connexions sont aussi peu stable, va falloir que je trouve autre chose u_u



    Le client

    les var:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSocketFile* m_pFile;
    CArchive* m_pArchiveIn;
    CArchive* m_pArchiveOut;
    l'init :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    m_pFile = new CSocketFile(this);
    m_pArchiveIn = new CArchive(m_pFile,CArchive::load);
    m_pArchiveOut = new CArchive(m_pFile,CArchive::store);
    reception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CClientSocket::OnReceive(int nErrorCode)
    {
    static CString msg;
    CString* pMsg;
    CSocket::OnReceive(nErrorCode);
    pMsg = ReadMsg();
    if (confirm)
    {
        msg = "OK";
        SendMsg(&msg);
    }
    la fonction ReadMsg :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CString* CClientSocket::ReadMsg()
    {
        static CString msg;
        TRY
        {
            (*m_pArchiveIn) >> msg;
        }
        CATCH(CFileException, e)
        {
            Abort();
        }
        END_CATCH
        return &msg;
    }
    apres on a sendmsg :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (*m_pArchiveOut) << (*pMsg);
    m_pArchiveOut->Flush();

    voila voila en gros pour le client...

    sinon niveau server, à part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m_pSocket = new ListeningSocket(&static_aff);
    if (m_pSocket->Create(5001))
    {
        m_pSocket->Listen();
    }
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void ListeningSocket::OnAccept(int nErrorCode)
    {
        CSocket::OnAccept(nErrorCode);
        CClientSocket* pSocket = new CClientSocket(aff,TRUE);
        if (Accept(*pSocket))
        {
            pSocket->Init();
            m_connexion=pSocket;
        }
        else delete pSocket;
    }
    le reste est géré par la socket client...
    je ne gère qu'une connexion à la fois pour le moment (retenue dans m_connexion), et c déjà assez chiant


    bref, j'aimerais savoir pourquoi le premier echange est généralement ok, mais pas les suivants :/

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    quel est le systeme d'exploitation du serveur ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    un PC sous Win XP

    les tests de base sont effectués entre 2 pc

    quelques fois entre deux XP, une fois XP et win98

    plusieurs fois en local



    et un test server XP et un client VAX (je perd le premier caractère de chaque message et le VAX semble envoyer à l'infini des paquets... fait par un prog en fortran sous vax, je le vois demain matin pour savoir ce qu'il envoie réellement)


    mais ce qui m'embete c'est déjà les paquets perdus entre 2 pcs sur le réseau local :/

Discussions similaires

  1. [MFC] CSocket ... problème à la fermeture
    Par Yellowmat dans le forum MFC
    Réponses: 7
    Dernier message: 29/04/2005, 15h37
  2. Crash InnoDB,perte de données définitives... Info ou Intox ?
    Par Alexandre T dans le forum Administration
    Réponses: 3
    Dernier message: 17/01/2005, 10h44
  3. [JTable] Perte des données
    Par david71 dans le forum Composants
    Réponses: 8
    Dernier message: 09/01/2005, 00h37
  4. Réponses: 4
    Dernier message: 11/06/2004, 16h27
  5. [MFC] Driver base de donnée
    Par kor dans le forum MFC
    Réponses: 5
    Dernier message: 07/01/2004, 15h06

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