Lorsque vous développez des applications client/server (sockets), il n'est pas toujours évident de savoir si c'est le client ou le serveur qui n'a pas envoyé les bonnes données. .NET permet de tracer les échanges.
Note: je travaille sous VS2005 en C#
Pour activer le traçage réseau, afin de "pister" les échanges entre un serveur et un client vous devez :
1° activer dans le menu "Générer" de la page "propriétés" de votre application les constantes DEBUG & TRACE
2° Ajouter le code suivant dans votre fichier app.config
<configuration> ..... ..... <system.diagnostics> <sources> <source name="System.Net"> <listeners> <add name="System.Net"/> </listeners> </source> <source name="System.Net.Sockets "> <listeners> <add name="System.Net"/> listeners> </source> <source name="System.Net.Cache"> <listeners> <add name="System.Net"/> </listeners> </source> </sources> <switches> <add name="System.Net"value="Verbose"/> <add name="System.Net.Sockets"value="Verbose"/ <add name="System.Net.Cache"value="Verbose"/> </switches> <sharedListeners> <add name="System.Net" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:my.log"/> </sharedListeners> <traceautoflush="true"/> </system.diagnostics> </configuration>
Quelques remarques :
Voici un exemple de log générée (on y voit clairement le contenu du message échangé ($$$DEB$$$...) :
[0460] Socket#39086322::Send() [0460] Data from Socket#39086322::Send 24 30 30 30 38 341 43 : $$$DEB$$$00088DC 52 56 5F 48 49 43 20 : QDSRV SRVSISC -43 20 20 20 37 2F 31 : VSESISC 27/1 36 3A 30 38 38 3 8 30 : 2/2006 16:08:380 30 30 30 30 30 31 24 : 000304400000001$ E 24 24 24- : $$FIN$$$ [0460] Exiting Socket#39086322::Send() -> 88#88 [2784] Socket#39086322::Receive() [2784] Exception in the Socket#39086322::Receive - Une opération non bloquante sur un socket n'a pas pu être achevée immédiatement [2784] Exiting Socket#39086322::Receive() -> 0#0 [1200] DNS::Resolve(localhost)
Attention : l'erreur que vous pouvez apercevoir dans ces log "System.Net.Sockets Error: 0 : [2784] Exception in the " correspond à une exception levée suite à un timeout sur la lecture (paramétrage applicatif pour l'utilisation de ma socket). Ce n'est donc pas une erreur applicative ...
Vous pouvez retrouver plus de précisions à http://msdn.microsoft.com/fr-fr/library/ty48b824(vs.80).aspx
Bon développement.
DT