IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de réception TCP/IP.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 17
    Par défaut Problème de réception TCP/IP.
    Bonjour à tous ,

    Je développe actuellement un programme qui joue entre autre le rôle de serveur TCP et j'ai un gros problème lors de la réception des données envoyées par le client:

    Dans ma boucle de réception, à un certain moment, la fonction 'Receive' de mon socket de réception, normalement bloquante, retourne directement en me renvoyant un nombre de bytes inférieur à celui demandé.
    Ce nombre est toujours soit 404 soit 0. Dans le cas où je reçois 0 byte, ma connexion est irrécupérable et la fonction Receive me retournera toujours 0.
    Par contre, lorsque je reçois 404 bytes, je reçois parfois les suivants au Receive suivant...

    J'ai l'impression que ce phénomène est du à un débordement du buffer de réception lorsque windows prend la main trop longtemps. Est-ce possible?
    Pourquoi la fonction Receive retourne simplement sans balancer d'exception?

    Le programme client étant programmé par quelqu'un d'autre, je n'y ai pas directement accès. Mais je suis quasi sûr qu'il continue à envoyer ses données.

    J'espère que mes explications sont assez claires

    Un tout grand merci d'avance ,

    BigBulle.

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    C'est toujours plus facile avec un bout de code :-) Montre nous ce que tu fait!

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 17
    Par défaut
    Merci beaucoup pour ta réponse !

    Voici le code qui effectue le lancement de mon thread d'accept:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Création du serveur Tcp
                tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                tcpServer.Bind(new IPEndPoint(IPAddress.Any, tcpLocalPort));
                tcpServer.Listen(50);
                acceptTcpClientThread = new Thread(new ParameterizedThreadStart(AcceptTcpClient));
                acceptTcpClientThread.Start(tcpServer);
    Voici le code du thread qui effectue l'accept:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void AcceptTcpClient(object server)
            {
                Socket s = (Socket)server;
                while (networkIsRunning)
                {
                    try
                    {
                        Socket newClient = new Socket(s.Accept());
     
                        receptionThreads.Add(new Thread(new ParameterizedThreadStart(TcpReception)));
                        receptionThreads[receptionThreads.Count - 1].Start(newClient);
                    }
                    catch (Exception ex)
                    {
                        WriteLogInformation(ex);
                        Thread.Sleep(500);
                    }
                }
     
            }
    Voici le code de mon thread de réception. Il est un peu complexe parce que je m'attend à ne pas recevoir tout les bytes en un coup à cause du problème que j'expose dans ce post...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    void TcpReception(object socket)
            {
                Socket client = (Socket)socket;
     
                byte[] buffer = new byte[528];
     
                try
                {
                    while (networkIsRunning && client.Connected /*&& groundIsRunning*/)
                    {
                        // Réception d'un nouveau message
                        int currentread = 0;
                        int totalread = 0;
                        int countzero = 0;
                        SocketError code = SocketError.Success;
     
                        do
                        {
                            currentread = client.Receive(buffer, totalread, buffer.Length - totalread, SocketFlags.None, out code);
                            totalread += currentread;
     
                            if (currentread == 0)
                            {
                                countzero++; Thread.Sleep(10);
                                if (countzero > 10) throw new Exception("La connexion " + client.ToString() + " a été perdue.");
                            }
                            if (currentread < buffer.Length) WriteLogInformation("Attention : Connection " + client.ToString() + " => Réception de " + totalread + " bytes.");
                        }
                        while (totalread < buffer.Length);
                    }
                }
                catch (Exception ex)
                {
                    WriteLogInformation(ex);
                }
            }
    J'espère que ça t'éclairera. J'ai retirer le code de traitement des données (décodage des bytes de réception) qui me semblait pas utile.

    Merci d'avance,

    A+

    BigBulle.

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Dans notre gestion socket, la réception de 0 bytes par le client indique une déconnection que l'on gère en déconnectant le client puis en essayant de le reconnecter.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 17
    Par défaut
    Merci pour ta réponse

    Qu'est-ce qui entraîne une déconnexion?
    Ton client invoque-t-il Shutdown() puis Close()?

Discussions similaires

  1. Problème de réception RECV (TCP/IP)
    Par CleeM dans le forum Réseau
    Réponses: 3
    Dernier message: 25/05/2012, 11h48
  2. Problème de réception via TCP
    Par Guispeed4262 dans le forum Réseau
    Réponses: 7
    Dernier message: 29/12/2010, 11h38
  3. [C#] Problème client-serveur TCP
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/06/2006, 16h23
  4. Réponses: 3
    Dernier message: 05/05/2004, 10h23
  5. Réponses: 5
    Dernier message: 11/03/2004, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo