Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SERVEUR TELNET (MULTI-CLIENTS)


Information sur la source

Catégorie :Réseau & Internet Niveau : Initié Date de création : 21/05/2003 Date de mise à jour : 21/05/2003 17:08:58 Vu / téléchargé: 4 277 / 507

Note :
Aucune note

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

J'ai eu besoin de débugguer une appli sur un PC distant. Celui-ci disposait de telnet (ligne de commande telnet + adresse de la machine). Alors j'ai fait un serveur telnet (port 23) en utilisant Winsock. Ce serveur accepte 10 clients max en même temps.
c'est un contrôle ActiveX, à poser dans une feuille de votre projet.
 

Source

  • VERSION 5.00
  • Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
  • Begin VB.UserControl TelnetMultiServer
  • ClientHeight = 4635
  • ClientLeft = 0
  • ClientTop = 0
  • ClientWidth = 3075
  • ScaleHeight = 4635
  • ScaleWidth = 3075
  • Begin VB.TextBox txtState
  • Height = 350
  • Index = 0
  • Left = 120
  • Locked = -1 'True
  • TabIndex = 0
  • Top = 120
  • Width = 2775
  • End
  • Begin VB.Timer tmStateCheck
  • Left = 3180
  • Top = 105
  • End
  • Begin MSWinsockLib.Winsock TcpServer
  • Index = 0
  • Left = 3195
  • Top = 645
  • _ExtentX = 741
  • _ExtentY = 741
  • _Version = 393216
  • End
  • End
  • Attribute VB_Name = "TelnetMultiServer"
  • Attribute VB_GlobalNameSpace = False
  • Attribute VB_Creatable = True
  • Attribute VB_PredeclaredId = False
  • Attribute VB_Exposed = False
  • Option Explicit
  • Private Const nMAX_CLIENTS As Integer = 10
  • Private IndexUsed(nMAX_CLIENTS) As Boolean
  • Private LastReceivedData(nMAX_CLIENTS) As String
  • Private MemoServerState(nMAX_CLIENTS) As Integer
  • Event ClientConnected(RemoteIP As String, index As Integer)
  • Event DataFromClient(Data As String, index As Integer)
  • Private Sub UserControl_Initialize()
  • Dim ServerIndex As Integer
  • ' Paramètres de la connexion
  • TcpServer(0).Protocol = sckTCPProtocol
  • TcpServer(0).LocalPort = 23
  • TcpServer(0).Listen
  • IndexUsed(0) = True
  • ' Paramètres du timer
  • tmStateCheck.Interval = 500
  • tmStateCheck.Enabled = False
  • ' Init
  • For ServerIndex = 0 To nMAX_CLIENTS
  • MemoServerState(ServerIndex) = -1
  • Next ServerIndex
  • End Sub
  • Private Sub UserControl_InitProperties()
  • ' Si le conteneur du contrôle est en mode création,
  • ' désactivation du timer, qui perturbe le fonctionnement du contrôle.
  • tmStateCheck.Enabled = Ambient.UserMode
  • End Sub
  • Private Sub UserControl_ReadProperties( _
  • PropBag As PropertyBag)
  • ' Si le conteneur du contrôle est en mode création,
  • ' désactivation du timer, qui perturbe le fonctionnement du contrôle.
  • tmStateCheck.Enabled = Ambient.UserMode
  • End Sub
  • Private Sub UserControl_Terminate()
  • Dim ServerIndex As Integer
  • tmStateCheck.Enabled = False
  • For ServerIndex = 1 To nMAX_CLIENTS
  • If IndexUsed(ServerIndex) Then
  • TcpServer(ServerIndex).Close
  • Unload TcpServer(ServerIndex)
  • Unload txtState(ServerIndex)
  • IndexUsed(ServerIndex) = False
  • End If
  • Next ServerIndex
  • TcpServer(0).Close
  • End Sub
  • Private Sub TcpServer_ConnectionRequest( _
  • index As Integer, _
  • ByVal requestID As Long)
  • Dim FreeServerIndex As Integer
  • If index = 0 Then
  • ' Recherche d'un numéro libre
  • FreeServerIndex = 1
  • Do
  • If IndexUsed(FreeServerIndex) = False Then Exit Do
  • FreeServerIndex = FreeServerIndex + 1
  • ' On n'accepte pas plus de nMAX_CLIENTS
  • If FreeServerIndex > nMAX_CLIENTS Then Exit Sub
  • Loop
  • ' Numéro libre trouvé
  • IndexUsed(FreeServerIndex) = True
  • Load TcpServer(FreeServerIndex)
  • Load txtState(FreeServerIndex)
  • txtState(FreeServerIndex).Top = 120 + (FreeServerIndex * 400)
  • txtState(FreeServerIndex).Visible = True
  • TcpServer(FreeServerIndex).LocalPort = 0
  • TcpServer(FreeServerIndex).Listen
  • ' Vérifie que le serveur est prêt
  • If TcpServer(FreeServerIndex).State = sckListening Then
  • ' Ferme l'attente d'autres clients
  • TcpServer(FreeServerIndex).Close
  • ' Accepte la demande de connexion avec le paramètre requestID
  • TcpServer(FreeServerIndex).Accept requestID
  • End If
  • End If
  • End Sub
VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.UserControl TelnetMultiServer 
   ClientHeight    =   4635
   ClientLeft      =   0
   ClientTop       =   0
   ClientWidth     =   3075
   ScaleHeight     =   4635
   ScaleWidth      =   3075
   Begin VB.TextBox txtState 
      Height          =   350
      Index           =   0
      Left            =   120
      Locked          =   -1  'True
      TabIndex        =   0
      Top             =   120
      Width           =   2775
   End
   Begin VB.Timer tmStateCheck 
      Left            =   3180
      Top             =   105
   End
   Begin MSWinsockLib.Winsock TcpServer 
      Index           =   0
      Left            =   3195
      Top             =   645
      _ExtentX        =   741
      _ExtentY        =   741
      _Version        =   393216
   End
End
Attribute VB_Name = "TelnetMultiServer"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Private Const nMAX_CLIENTS As Integer = 10
Private IndexUsed(nMAX_CLIENTS) As Boolean
Private LastReceivedData(nMAX_CLIENTS) As String
Private MemoServerState(nMAX_CLIENTS) As Integer

Event ClientConnected(RemoteIP As String, index As Integer)
Event DataFromClient(Data As String, index As Integer)

Private Sub UserControl_Initialize()
    Dim ServerIndex As Integer
    
    ' Paramètres de la connexion
    TcpServer(0).Protocol = sckTCPProtocol
    TcpServer(0).LocalPort = 23
    TcpServer(0).Listen
    IndexUsed(0) = True
    ' Paramètres du timer
    tmStateCheck.Interval = 500
    tmStateCheck.Enabled = False
    ' Init
    For ServerIndex = 0 To nMAX_CLIENTS
        MemoServerState(ServerIndex) = -1
    Next ServerIndex
End Sub

Private Sub UserControl_InitProperties()
    ' Si le conteneur du contrôle est en mode création,
    ' désactivation du timer, qui perturbe le fonctionnement du contrôle.
    tmStateCheck.Enabled = Ambient.UserMode
End Sub

Private Sub UserControl_ReadProperties( _
    PropBag As PropertyBag)
    
    ' Si le conteneur du contrôle est en mode création,
    ' désactivation du timer, qui perturbe le fonctionnement du contrôle.
    tmStateCheck.Enabled = Ambient.UserMode
End Sub

Private Sub UserControl_Terminate()
    Dim ServerIndex As Integer
    
    tmStateCheck.Enabled = False
    For ServerIndex = 1 To nMAX_CLIENTS
        If IndexUsed(ServerIndex) Then
            TcpServer(ServerIndex).Close
            Unload TcpServer(ServerIndex)
            Unload txtState(ServerIndex)
            IndexUsed(ServerIndex) = False
        End If
    Next ServerIndex
    TcpServer(0).Close
End Sub

Private Sub TcpServer_ConnectionRequest( _
    index As Integer, _
    ByVal requestID As Long)
    
    Dim FreeServerIndex As Integer
    
    If index = 0 Then
        ' Recherche d'un numéro libre
        FreeServerIndex = 1
        Do
            If IndexUsed(FreeServerIndex) = False Then Exit Do
            FreeServerIndex = FreeServerIndex + 1
            ' On n'accepte pas plus de nMAX_CLIENTS
            If FreeServerIndex > nMAX_CLIENTS Then Exit Sub
        Loop
        ' Numéro libre trouvé
        IndexUsed(FreeServerIndex) = True
        Load TcpServer(FreeServerIndex)
        Load txtState(FreeServerIndex)
        txtState(FreeServerIndex).Top = 120 + (FreeServerIndex * 400)
        txtState(FreeServerIndex).Visible = True
        TcpServer(FreeServerIndex).LocalPort = 0
        TcpServer(FreeServerIndex).Listen
        ' Vérifie que le serveur est prêt
        If TcpServer(FreeServerIndex).State = sckListening Then
            ' Ferme l'attente d'autres clients
            TcpServer(FreeServerIndex).Close
            ' Accepte la demande de connexion avec le paramètre requestID
            TcpServer(FreeServerIndex).Accept requestID
        End If
    End If
End Sub
 

Conclusion

Des événements sont générés dès qu'un client se connecte (avec son adresse IP), et si le client envoie une chaine de caractères.

Pour envoyer une chaine au client, utiliser la fonction SendData(). Vous pouvez préciser à quel client vous envoyer le message, sinon il est envoyé à tous...
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de EBArtSoft le 21/05/2003 12:47:55 administrateur CS

Bonjour,

Ben appel ta source "Control Serveur Telnet" alors
car avec sa on debugge rien du tout ?!?

mais sans vouloir denigrer ta source tu ne fait rien d'autre que de
rediriger les pacquet reçu sur le port 23 !

alors pourquoi en faire un control, tu peut le gerer directement a partir d'un control winsock sur une feuille !

bref je dirait juste que :
1) le titre est mal choisi
2) la source est incomplete

b@nne prog

signaler à un administrateur
Commentaire de facdaar le 21/05/2003 13:57:48

Je ne suis pas tout à fait d'accord.
D'abord, c'est un contrôle, parce qu'il est réutilisable, et tu peux coller ce même contrôle dans X projets différents. Ensuite, le fait d'avoir un contrôle permet de charger dynamiquement d'autres instances de ce même contrôle pour gérer n clients en même temps.
Le biut de ce contrôle est ensuite, pour débugguer ton appli, au lieu d'écrire bêtement dans un fichier texte à différents endroits de ton code, tu truffe ton code de la procédure SendData. Si un utilisateur est connecté, il reçoit la chaîne.

Maintenant tu en penses ce que tu veux.

signaler à un administrateur
Commentaire de EBArtSoft le 21/05/2003 15:35:54 administrateur CS

Et bien je veus pas te vexer mais...
le titre de ta source est tout de meme completement a coté de
ce que tu propose et de plus le fait de le mettre en controle
ne te permettra absolument pas de créer plusieur instance car
tu ne peut pas ouvrir deux fois le meme port en mode "Listen"
donc tes deuxieme et n-ieme controles ne marcherons pas correctement...

le code est bon je dit pas le contraire mais
j'ai tjr pas compris comment debbuger une appli avec ça ?!?

@ +

signaler à un administrateur
Commentaire de facdaar le 21/05/2003 17:03:45

Ce que j'en dis c'est que moi ça m'a permis de débugguer une appli. Le premier réflexe est d'écrire par exemple en chaque début de procédure dans un fichier texte, puis de récupérér le fichier texte. Là tu as les infos en live sur tes postes distants...
De plus, oui, je fais bien un chargement dynamique du contrôle Winsock que j'ai appelé TcpServer. Voir la ligne Load TcpServer.

Maintenant je veux bien admettre que c'est un serveur Telnet multi-clients, et pas un débuggeur.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.