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 :

Impossible d'envoyer plus de bytes que la taille du buffer (TCP SOCKET c#) [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Amateur c#
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Amateur c#
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut Impossible d'envoyer plus de bytes que la taille du buffer (TCP SOCKET c#)
    Bonjour à tous.

    Comme beaucoup, je suis en train de faire des applications "client-serveur".
    Connexion serveur: ok
    Connexion client au serveur: ok
    Envoi d'un "message" (tableau de bytes): ok ==> j'envoi un tableau de 4 bytes avec la taille du message à suivre en entête.
    Jusque là, tout marche nickel!

    Le problème:
    J'envoie, j'envoie, j'envoie. De l'autre côté, je lie, je lie, je lie. Et à un moment, la connexion est perdue.
    Après recherche, voici ce que je constate:
    La sommes des bytes envoyé de mon serveur à mon client est de "ReceiveBufferSize".

    En gros, j'ai l'impression que toutes mes données se stock dans la mémoire tampon sans jamais se vider et fais cracher ma connexion!
    Evidement, dès que j'envoie aussi un tableau de bytes de plus de cette valeur "ReceiveBufferSize", c'est la déconnexion immédiate.

    Je ne comprend absolument pas pourquoi...

    Chez mon serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    socket.Send(buffer);
    //buffer est un "Byte[]" avec mes données

    Chez mon client, je boucle sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int bytesRecu = socket.Receive(bytes, bytesDispo, SocketFlags.None);
    //bytesDispo est un "Int" de la taille du message attendu reçu au par-avant (voir explication ci dessus)
    Merci à vous

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tu peux envoyer autant que tu veux sans problèmes
    genre send(2Go) ca passe sans problème, après c'est windows qui prend le relais pour découper en packets
    par contre côté receveur tu vas recevoir des morceaux de 1 à 8 ko, donc il faut faire Read tant qu'il y a des données
    le mieux est de faire ca en asynchrone, sinon fait une boucle qui read tant que c'est possible (et donc le petit morceau est à ajouter à une collection d'octets car un morceau ne sert à rien tant que tu n'as pas reçu un bloc traitable entier)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Amateur c#
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Amateur c#
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Bien justement, je ne peux pas envoyer 2Go...
    Dès que j'envois plus de 65536 bytes. le socket est déconnecté.

    En effet, je le fais en synchrone, mais je le gère en multi-threding, ça psse tout seul.
    Le thread est bloqué jusqu'à obtenir un buffer, et je boucle si mon byte de réception est plus petit que le buffer.

    Le problème est vraiment sur le fait que dès que j'attend les 65536, que ce soit en une fois ou en plusieurs fois!

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    je suis en train de me demander si tu n'utilises pas les classes socket du framework
    auquel cas moi je parles de tcpClient et tcpListener qui est une encapsulation simplifiante des classes sockets
    les classes sockets faut un niveau de maitrise bien plus poussé du fonctionnement matériel pour les utiliser je pense

    et donc avec tcpclient c'est
    cli.GetStream().Write(2Go) et ca passe (j'ai testé y a pas longtemps)
    et côté receveur c'est cli.GetStream.Read(buffer ...


    sinon y a les webservices, ca évite de coder tout ca
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Amateur c#
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Amateur c#
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Et bien, LA donnée que je n'avais pas donnée, c'est quelques chose dont je ne doutais pas que ça soit important:

    Le port utilisé par mon serveur:
    J'utilisais le port 21 prévu pour les serveur FTP.
    J'ai changé ce port par un autre non utilisé (au hasard le 60429 pour le test) et je peux envoyer mes Go sans problème!

    Le fait que le 21 soit prévu pour FTP, je suppose donc de Windows ou même autre chose (le routeur?) bloque les données trop importantes!

    Bon bah voilà, résolu...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pourquoi les fichiers envoyés pèsent plus lourd dans un mail que leur taille d'orgine?
    Par clavier12AZQSWX dans le forum La taverne du Club : Humour et divers
    Réponses: 12
    Dernier message: 25/09/2012, 15h54
  2. Réponses: 1
    Dernier message: 13/07/2011, 14h09
  3. Réponses: 1
    Dernier message: 03/09/2010, 16h37
  4. paquets envoyés plus importants que ceux recus
    Par joe123 dans le forum Hardware
    Réponses: 12
    Dernier message: 14/12/2006, 13h05
  5. Réponses: 19
    Dernier message: 24/03/2006, 12h45

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