Comment vérifier l'état de connexion d'un Serveur TCP (Socket) avec le protocole TCP Client dans VB.NET
Pendant presque une semaine que je suis de lecture et d'essayer de trouver une solution pour le contrôle de l'état de connexion à l'aide d'un Client TCP (en utilisant la classe socket)
Dans mon scénario, j'ai un Client TCP qui est connecté à un serveur (il n'est pas contrôlé par moi) et je veux que, de temps à autre pour vérifier l'état de la connexion, puis rebranchez-le si nécessaire.
J'ai lu beaucoup d'informations sur internet, mais je n'ai pas trouver une solution adaptée.
Brièvement, ce sont les méthodes que j'ai trouvées sur internet et essayer de les mettre en œuvre.
Mais malheureusement, j'ai trouvé quelques scénarios où le Serveur TCP est fermée et que le Client TCP est encore en disant Connecté
Mai j'ai bien vouloir demander à quelqu'un qui ont rencontré ce problème m'aider?
1.Exemple à partir de MSDN
Private Function IsConnected(tcpSocket As Socket) As Boolean
Dim blockingState As Boolean = tcpSocket.Blocking
IsConnected = False
Try
Dim tmp(0) As Byte
tcpSocket.Blocking = False
tcpSocket.Send(tmp, 0, 0)
Return True
Catch e As SocketException
If e.NativeErrorCode.Equals(10035) Then
Return True
Else : Return False
End If
ThrowError(e)
Finally
tcpSocket.Blocking = blockingState
End Try
End Function
2.Exemple d'utilisation de Sondage
Function Connected() As Boolean
Connected = False
If (tcpSocket.Connected) Then
If ((tcpSocket.Poll(0, SelectMode.SelectWrite)) AndAlso (Not tcpSocket.Poll(0, SelectMode.SelectError))) Then
Dim b As Byte() = New Byte(1) {}
If tcpSocket.Receive(b, SocketFlags.Peek) = 0 Then
Return False
Else : Return True
End If
Else
Return False
End If
Else
Return False
End If
End Function
3.À L'Aide De Sondage
Private Function Connect2() As Boolean
Connect2 = False
If tcpSocket.Poll(0, SelectMode.SelectRead) = True Then
Dim byteArray As Byte() = New Byte(1) {}
If (tcpSocket.Receive(byteArray, SocketFlags.Peek)) = 0 Then Connect2 = True
End If
Return Connect2()
End Function
- Il n'y a en principe aucun moyen fiable de savoir si la connexion est toujours utilisable sans recevoir une valeur de la distance. Le réseau entre les deux est peut-être juste un trou noir, et vous ne le savez sans recevoir quelque chose.
Vous devez vous connecter pour publier un commentaire.
Souvent, les systèmes gérer ce genre de problème par la mise en œuvre d'un "battement de coeur" mécanisme où le client envoie périodiquement une "êtes-vous en vie" requête au serveur. Est-il bon marché, non-destructive demande, vous pouvez envoyer au serveur régulièrement qui vous permettra d'assurer le support est en fait vivant?
C'était quelque chose que j'ai lutté avec pendant un certain temps et n'a jamais vraiment trouvé une solution. Malheureusement, il n'est pas 100% fiable, qui est pourquoi la plupart des système de mettre en œuvre un "battement de coeur" (comme Steve Townsend mentionné).
Le plus proche que je pouvais faire était quelque chose comme ceci (traduit à partir de C# par de mémoire):
Je ne sais pas votre installation, mais vous mentionnez que vous êtes connecté à une échelle. Vous pourriez peut-être essayer de lire le poids de périodiquement comme une forme de "battement de coeur".