RBonjour à tous.

J'ai dois concevoir un petit serveur TCP/IP multi-thread. Voilà le début :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public class TCPServer
{
    // Déclaration des délégés
    public delegate void ClientConnected( int iClientID );
    public delegate void ClientDisconnected( int iClientID );
    public delegate void ClientErrorOccured( int iClientID, Exception e );
    public delegate void ClientDataReceived( int iClientID, byte[] data );
    
    // Déclaration des événements
    public event ClientConnected OnClientConnected;
    public event ClientDisconnected OnClientDisconnected;
    public event ClientErrorOccured OnClientErrorOccured;
    public event ClientDataReceived OnClientDataReceived;

    // Déclaration des membres privés
    private string m_IPAddress = "127.0.0.1";
    private int m_PortNumber = 2222;
    private bool m_bIsRunning = false;
    private TcpListener m_TCPListener = null;
    // ... 

    // Événements par défaut 
    private void ClientConnectedEvent( int iClientID )
    {
       if (OnClientConnected != null)
           OnClientConnected( iClientID );
    }
    private void ClientDataReceivedEvent( int iClientID, byte[] data )
    {
       if (OnClientDataReceived != null)
           OnClientDataReceived( iClientID, data );
    }
    // ... 
    
    // Constructeur 
    public TCPServer( string ipAddress, int iPortNumber )
    {
         m_PortNumber = iPortNumber;
         m_IPAddress = ipAddress;
    }

    // Démarrage du server 
    public void Start() 
    {
        Thread serverThread = new Thread( new ThreadStart( Listen ) );
        serverThread.Start();
    }

    // Main loop du serveur 

    private void Listen()
    {
	m_bIsRunning = true;
	m_TCPListener = new TcpListener( System.Net.IPAddress.Parse(m_IPAddress), m_PortNumber );
	m_TCPListener.Start();
	while( m_bIsRunning )
	{
                  // Waiting for a connection
                  Socket clientSocket = null;
                  try
                  {
                     clientSocket = m_TCPListener.AcceptSocket();
                  }
                  catch (SocketException se )
                  {
                      ClientErrorOccuredEvent( -1, se );
                      continue;
                  }

                  // Client connecté
                  if (clientSocket.Connected)
                  {
                      m_ClientID++;
                      // Déclancher l'événement de connection
                      ClientConnectedEvent( newClientID );

                      // Créer un object ServerClientThread
                      ServerClientThread sct = new ServerClientThread( newClientID, clientSocket );
					
			
                     // Démarage du nouveau processus (gestion du client connecté)
                     Thread serverThread = new Thread( new ThreadStart( sct.Process ) );
                     serverThread.Start();
                     // ... 
                  }
      // ... 
      }
   }
}
Maintenant voici la classe Wrapper ServerClientThread :
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
17
18
19
20
21
22
23
24
25
26
27
public class ServerClientThread
{
    // Déclaration des membres privés
    private bool m_bStopProcess = false;
    // ...

    // Constructeur 
    public ServerClientThread( int iClientID, Socket clientSocket )
    {
        m_ClientID = iClientID;
        m_ClientSocket = clientSocket;
    }

    // Point d'entré du thread 
    public void Process()
    {
       while (!m_bStopProcess)
       {
// À partir d'ici je créer un NetworkStream et j'attend les
entrées de donnée. Cependant, comment puis-je déclancher l'événement
ClientDataReceived de la classe TCPServer qui à
démarré ce thread ? Sous C++ j'aurais déclarer cette classe comme étant
FRIEND mais en c# ??? 
       }        
    }
}
Alors voilà, je crois bien que ma question est claire
Merci pour votre aide.