none
sending a binary file through TCP socket RRS feed

Réponses

  • Bonsoir,

    Voici un code d'exemple simple. Biensûr c'est en asynchrone n'acceptant qu'une seule connexion.

    Serveur :

    static void Main(string[] args)
            {
                Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                listener.Bind(new IPEndPoint(IPAddress.Any, 15000));
                listener.Listen(0);
    
                int totalLen = 0;
    
                Socket client = listener.Accept();
                byte[] buffer = new byte[4096];
                FileStream fStream =  File.Create(@"C:\tmp\Capture.JPG");
    
                int len = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                while (len > 0)
                {
                    totalLen += len;
                    fStream.Write(buffer, 0, len);
                    len = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                }
                fStream.Close();
                client.Close();
                Console.WriteLine(totalLen);
                Console.ReadLine();//maintenir la console ouverte
            }

    Client :

    static void Main(string[] args)
            {
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect("localhost", 15000);
                int totalLen = 0;
                using (FileStream fStream = File.OpenRead(@"C:\Users\lbenk\Desktop\Capture.JPG"))
                {
                    byte[] buffer = new byte[4096];
                    int len = fStream.Read(buffer,0, buffer.Length);
    
                    while(len>0){
                        totalLen += len;
                        client.Send(buffer, 0, len, SocketFlags.None);
                        len = fStream.Read(buffer, 0, buffer.Length);
                    }
                    client.Close();
                    Console.WriteLine(totalLen);
                    Console.ReadLine();
                }
            }

    Est-ce que ça répond à vos besoins ?

     

    Cordialement

    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 8 novembre 2012 17:03

Toutes les réponses

  • Hi/Bonjour

    You are on the French forums, so if you post in French, you will have more chances to get an answer.

    Vous êtes dans les forums français. Postez en français pour plus de chance d’avoir une réponse. 

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 8 novembre 2012 11:11
  • Bonjour!

    Pardon pour avoir confondu les forum, je suis tout à fait d'accord avec vous. donc voilà ma version french en espérant un peu  d'aide de la part des membres du forum français:

    J'utilise les socket TCP pour l'envoie d'un fichier binaire, ce fichier , de la taille de 5 Mo, ne parvient pas en sa totalité a la partie réception en effet j'ai utilisé l’hyper-terminal pour capturer les données transmises en les enregistrant sur un fichier texte, en le comparant à l'originale (lui aussi transformé en fichier texte) je m’aperçois que sur les 5 Mo j’obtiens seulement 1 Mo, donc il m'a semblé logique qu'en divisant mon fichier binaire en 5 morceaux de 1Mo et en les envoyant séparément j'arriverais à les recevoir en leur totalité, et là surprise sur les 1 Mo que j’obtiens je reçois seulement 255 ko!!

    ceci est le bout de code que j'utilise, et merci pour toute suggestion:

     private void senduimage_Click(object sender, EventArgs e)
    {
      
            string inpath = "C:\\Documents and Settings\\Bureau\\uImage.bin";
             FileStream fs = new FileStream(inpath, FileMode.Open, FileAccess.Read);
        if (!user.clientSocket_NewSocket.Connected)
        {
    
        Socket clientSocket_NewSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         user.clientSocket_NewSocket = clientSocket_NewSocket;
         try
          {
            System.IAsyncResult _NewSocket = user.clientSocket_NewSocket.BeginConnect(ip_address, NewSocket.Transceiver_TCP_Port, null, null);
            bool successNewSocket = _NewSocket.AsyncWaitHandle.WaitOne(2000, true);
          }
         byte[] buff = null;
         BinaryReader br = new BinaryReader(fs);
         string inpath = "C:\\Documents and Settings\\Bureau\\uImage"
         long numbytes = new FileInfo(inpath).Length;
         buff = br.ReadBytes((int)numbytes);
         user.clientSocket_NewSocket.Send(buff);
        }
    }


    • Modifié sami17 jeudi 8 novembre 2012 14:01
    jeudi 8 novembre 2012 13:11
  • Bonjour,

    Vue que vous utiliser la socket en mode connecté, l'appel Send ne peut se terminer qu'une fois la totalité des données a été envoyée :

    Msdn =>

    Si vous utilisez un protocole orienté connexion, Send se bloque jusqu'à ce que tous les octets de la mémoire tampon soient envoyés, à moins qu'un délai n'ait été défini à l'aide de Socket.SendTimeoutSend lève SocketException

    Le problème viendrait probablement coté réception à moins que l'appel Send ait provoquée une exception à la quelle il faudrait s'intéresser dans ce cas là.

    Cordialement.



    jeudi 8 novembre 2012 14:41
    Auteur de réponse
  • Bonjour

    J’ai mal à comprendre pourquoi vous avez   

    string inpath = "C:\\Documents and Settings\\Bureau\\uImage" 

    Ici il n’y a pas l’extension du fichier.  

    Utilisez le debugger pour inspecter si la valeur du longnumbytes est correcte.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 8 novembre 2012 14:56
  • Bonsoir,

    Voici un code d'exemple simple. Biensûr c'est en asynchrone n'acceptant qu'une seule connexion.

    Serveur :

    static void Main(string[] args)
            {
                Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                listener.Bind(new IPEndPoint(IPAddress.Any, 15000));
                listener.Listen(0);
    
                int totalLen = 0;
    
                Socket client = listener.Accept();
                byte[] buffer = new byte[4096];
                FileStream fStream =  File.Create(@"C:\tmp\Capture.JPG");
    
                int len = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                while (len > 0)
                {
                    totalLen += len;
                    fStream.Write(buffer, 0, len);
                    len = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                }
                fStream.Close();
                client.Close();
                Console.WriteLine(totalLen);
                Console.ReadLine();//maintenir la console ouverte
            }

    Client :

    static void Main(string[] args)
            {
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect("localhost", 15000);
                int totalLen = 0;
                using (FileStream fStream = File.OpenRead(@"C:\Users\lbenk\Desktop\Capture.JPG"))
                {
                    byte[] buffer = new byte[4096];
                    int len = fStream.Read(buffer,0, buffer.Length);
    
                    while(len>0){
                        totalLen += len;
                        client.Send(buffer, 0, len, SocketFlags.None);
                        len = fStream.Read(buffer, 0, buffer.Length);
                    }
                    client.Close();
                    Console.WriteLine(totalLen);
                    Console.ReadLine();
                }
            }

    Est-ce que ça répond à vos besoins ?

     

    Cordialement

    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 8 novembre 2012 17:03
  • Bonjour,

    En complément de la réponse de Lyamine, le problème semble être que vous vous attendez à tout recevoir d'un coup. Le principe est plutôt que vous devez lire les données que l'on vous donne jusqu'à ne plus rien recevoir.

    Si le code de Lyamine ne permet pas de résoudre votre problème :
    - je suggère de commencer par cumuler les valeurs de retour de Send et Receive pour voir combien d'octets vous envoyez/recevez et voir laquelle des deux n'est pas bonne. Pour l'instant je soupçonne que le problème est du côté de la réception plutôt que de l'envoi.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    vendredi 9 novembre 2012 16:51
    Modérateur
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 14 novembre 2012 07:38