Bonjour;

Je suis en train de développer une appli client/serveur de messagerie instantannée Like MSN. J'ai consulter énormément de topic, tuto et cours mais je suis sur une erreur et aussi quelques interrogations.
En effet j'ai trouvé beaucoup d'exemple concernant des applications où le serveur "se contenter" de mettre en relation plusieurs client mais dans le cas d'une application de messagerie instantannée l'application est à la fois cliente et serveur car chaque client doit pouvoir envoyer et recevoir des messages.

J'utilise donc les sockets en mode asynchrone et le démarrage du serveur se passe bien :


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
 
//Création de la socket 
            this.ServerSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream,
            ProtocolType.Tcp);
            try
            {
                //On lie la socket au point de communication 
                ServerSocket.Bind(new IPEndPoint(ipAddress, 8000));
 
                //On la positionne en mode "écoute" 10 Clients Max 
                ServerSocket.Listen(10);
 
                //On se met en attente de la connection d'un client  
                ServerSocket.BeginAccept(new AsyncCallback(ConnectionAcceptCallback), ServerSocket);
                MessageBox.Show("Serveur démarré en : "+ipAddress);


Ensuite un client se connecte au serveur (typiquement en double clic sur un contact de sa liste) ou en rentrant l'ip a contacter (le port n'étant pas configurable mais c'est un détail pour l'instant)


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
this.SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
                IPAddress ipadress;
                //On récupere l'adresse ip a contacter 
                ipadress = IPAddress.Parse(ip_destinataire.Text);
 
                this.SocketClient.BeginConnect(new IPEndPoint(ipadress, 8000), new AsyncCallback(ConnectCallback), this.SocketClient);

Venant en au problème l'envoi d'un message du client au serveur et inversement.
Une fois que le client est connecté j'ouvre un Nouvelle Form "Message" qui sert a saisir le message à envoyer.
Mais le serveur n'est pas encore en attente de message et je ne sais pas quand le faire pour moi le plus simple étant de mettre le serveur en attente dès que le client ce sera connecté au serveur (même s'il peut se connecter et rien écrire finalement).


J'ai donc une fonction ReceiveMessage()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
public void ReceiveMessage()
        {
            if (this.SocketClient != null && this.SocketClient.Connected)
            {
                //On se met en attente d'un message 
                this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
            }
            else
            {
                MessageBox.Show("Client non connecté" );
            }
        }


Qui est appelé lorsqu'un client vient de se connecter

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
//on accepte la connection 
                    this.SocketClient = socket.EndAccept(asyncResult);
                    MessageBox.Show("Connexion acceptee" );
 
                    ReceiveMessage();
                }



et j'ai l'erreur suivante :


Voilà je sais que c'est un peu long mais j'essaye d'être précis et c'est pas facile d'expliquer un projet en cours de réalisation.
N'hésitez pas de faire des suggestions elles seront bienvenu...

Merçi