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:
l'init :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CSocketFile* m_pFile; CArchive* m_pArchiveIn; CArchive* m_pArchiveOut;
reception :
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);
la fonction ReadMsg :
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); }
apres on a sendmsg :
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; }
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 :
et :
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(); }
le reste est géré par la socket client...
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; }
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 :/
Partager