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
    Membre averti
    Inscrit en
    D�cembre 2004
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 46
    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
    Par d�faut
    salut,
    quel est le systeme d'exploitation du serveur ?

  3. #3
    Membre averti
    Inscrit en
    D�cembre 2004
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 46
    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