Je suis en train de faire des tests sur les sockets TCP dans le framework 2.0 et j'ai remarqué quelque chose d'assez curieux...
Je voulais savoir à quel niveau sont renvoyés les exceptions typiquement lorsqu'un cable réseau est arraché ou autre. Pour tester, j'utilise un client telnet sur un PC pour ouvrir un socket avec mon serveur dont le code est ci-dessous. Tout de suite après je déconnecte le PC client du réseau (j'enlève le cable à la barbare ^^), puis je fais des sleep pendant un certain temps voir si j'ai une exception qui est remontée par le framework.
Jusque là, pas d'exception alors que la pile TCP a du se vautrer en raison de l'absence du client qui a été déconnecté sauvagement :) Là je me dis c'est normal, j'aurais une exception la prochaine fois que je veu utiliser mon socket. Du coup je tente de faire un send ... et bingo !!! Aucune exception et le retour du send me dit qu'il a bien envoyé ces octets :s J'essaye même de regarder la valeur "connected" du socket pour voir si j'ai bien quelqu'un en face et il me dit que oui ... :(
Bref, voila mon problème : comment savoir si j'ai toujours quelqu'un en face avec le .net framework ? Et surtout comment savoir quand il me dit que mes données ont bien été envoyées (retour du send) alors que c'est pas le cas ??
Par la suite j'ai essayé d'utiliser la variable SendTimeout du socket mais ca n'a rien changé ...
Voici le code tout bête de mon serveur TCP pour que vous voyez exactement ce que je fais :
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Form1
Dim port As Integer = 10000
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sckListening As Socket
Dim sckClient As Socket
sckListening = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
sckListening.Bind(New IPEndPoint(IPAddress.Any, port))
sckListening.Listen(5)
System.Console.WriteLine("Socket en écoute sur " & sckListening.LocalEndPoint.ToString)
sckClient = sckListening.Accept()
System.Console.WriteLine("Serveur: Connexion acceptée avec " & sckClient.RemoteEndPoint.ToString)
'On règle le sois-disant timeout TCP pour l'envoi
sckClient.SendTimeout = 1000
'Là en gros on dort pendant 50 sec pendant qu'on arrache (gentiment) le cable du client
'A chaque sleep on affiche la variable Connected du socket pour voir s'il ya toujours
'quelqu'un en face
Dim i As Integer
For i = 0 To 9
System.Console.WriteLine("Attente de plantage ... " & CStr((i + 1) * 5) & "sec")
System.Console.WriteLine("Socket connecté ? " & sckClient.Connected.ToString)
Threading.Thread.Sleep(5000)
Next
'Maintenant on envoi 6 octets sur le socket qui est mort pour voir si on récupère une
'exception
Dim nbByte As Integer
nbByte = sckClient.Send(Encoding.ASCII.GetBytes("bijour"), 6, SocketFlags.None)
System.Console.WriteLine(CStr(nbByte))
'On a eut aucune exception et la fonction send a envoyer son retour immédiatement
'Mais on fait des sleeps en se disant que le SendTimeout va peut être nous générer
'une exception plus tard
For i = 0 To 9
System.Console.WriteLine("Attente de plantage ... " & CStr((i + 1) * 5) & "sec")
System.Console.WriteLine("Socket connecté ? " & sckClient.Connected.ToString)
Threading.Thread.Sleep(5000)
Next
'Et voilà c'est fini, et on a envoyé des données comme si de rien n'était à un client inexistant
System.Console.WriteLine("Fin")
End Sub
End ClassMerci d'avances pour vos réponses :)