Traçage réseau

Introduction

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#

Tutoriel

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 :

  • Vous pouvez/devez laisser les balises existantes contenues dans <configuration></configuration>
  • Les lignes dans la balise <switches>indique les méthodes à tracer (ex : System.Net.Sockets pour les méthodes socket, TcpListner, TcpClient...)
  • les param value de la balise <switches>indique le type de trace à lister (Verbose : très explicite)</switches></switches>

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 ...

Pour aller plus loin

Vous pouvez retrouver plus de précisions à http://msdn.microsoft.com/fr-fr/library/ty48b824(vs.80).aspx

Bon développement.
DT

Ce document intitulé « Traçage réseau » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous