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