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

Windows Forms Discussion :

[C#] Problème transmission via socket


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [C#] Problème transmission via socket
    Bonjour à tous,
    Je cherche à émettre une liste de fichier depuis une application vers un serveur.

    J'utilise pour cela la classe socket et la méthode SendFile()

    Lorsque le client veux envoyer un message, il appelle une fonction d'un service web qui démarre un serveur d'écoute sur un port spécifique. Puis il commence l'émission.



    J'ai fait ceci depuis le client:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
        class Client
        {
            Socket S;
            private int PORT;
            public Client(int Port)
            {
                this.PORT=Port;
                S = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                S.Connect(Dns.GetHostAddresses("127.0.0.1")[0], this.PORT);
            }
     
            public void SENDFILE(string FileName)
            {
     
                try
                {
                    byte[] pre_buffer = Encoding.ASCII.GetBytes("#START_FILE\\" + FileName);
                    byte[] post_buffer = Encoding.ASCII.GetBytes("#END_FILE\\");
                    S.SendFile(FileName, pre_buffer, post_buffer, TransmitFileOptions.UseDefaultWorkerThread);
     
     
                    S.Close();
                    MessageBox.Show("Connexion fermée");
                }
                catch (FileNotFoundException e)
                {
                    new Error("File not found", e.Message);
                }
                catch (SocketException e)
                {
                    new Error("error socket", e.Message);
                }
                catch (ObjectDisposedException e)
                {
                    new Error("Socket closed", e.Message);
                }
                catch (InvalidOperationException e)
                {
                    new Error("socket blocked", e.Message);
                }
                catch (SystemException e)
                {
                    new Error("error system", e.Message);
                }
     
            }
     
        }
    Le prblème, je pense vient du côté du serveur où k'ai le code suivant:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
     
    public class serveur
    {
        Socket C_S;
        Socket S_S;
        int PORT;
        string SID;
        byte[] buffer = new byte[4096];
        int count;
     
        public serveur()
        { }
        public serveur(int PORT, string SID)
        {
            this.PORT = PORT;
            this.SID = SID;
            S_S = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     
        }
     
        public string start()
        {
            try
            {
                new Thread(new ThreadStart(ListenTo)).Start();
                return "ok";
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }
     
        private void ListenTo()
        {
            try
            {
                S_S.Bind(new IPEndPoint(IPAddress.Any, this.PORT));
                S_S.Listen(1);
                FileStream stw;
                stw = System.IO.File.Create("c:\\sock.txt",4096,FileOptions.None);
                while((C_S=S_S.Accept())!=null)
                {
                    if (C_S.Available>0)
                    {
                        count = C_S.Receive(buffer, 0, 4096, SocketFlags.None);
                        stw.Write(buffer, 0, count);
                    }
                    else
                    {
                        S_S.Close();
                        C_S.Close();
                    }
                }
                stw.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("serveur: "+e.Message);
            }
        }
    Le serveur démarre bien mais le problème doit venir de la fonciton ListenTo().
    Le fichier sock.txt est bien créé mais rien n'est écrit dedans.
    Lorsque je tente de l'ouvrir un message d'erreur me dit qu'un autre processus est sur le fichier.
    Lorsque que kill asp_wp.exe, je peux ouvrir le fichier mais rien n'est dedans.

    Ques-ce qui ne va pas ???

    Merci pour votre aide !!!!!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    J'ai avancé un petit peu et après de nombreuses tentatives de debug, je sêche.

    Je reçois les données sur le socket de cette façon:
    (j'en profite pour écrire dan sun fichier les informations sur le socket)

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
        private void ReceiveFrom()
        {
    //C_S est le socket créé lorsque le serveur reçoit une nouvelle connexion
    //C_S provient de C_S=S_S.accept()
            Stream fs;
            fs = File.Create("c:\\sock1.txt");
            StreamWriter stw = new StreamWriter(fs);
            stw.AutoFlush = true;
            stw.WriteLine("1.qte reçue: " + C_S.Available.ToString());
            stw.WriteLine("1.Connectée ?: " + C_S.Connected.ToString());
            stw.WriteLine("1.Bloquée ?: " + C_S.Blocking.ToString());
            stw.WriteLine("1.Bounded ?: " + C_S.IsBound.ToString());
            stw.WriteLine("1.Local endpoint ?: " + C_S.LocalEndPoint.ToString());
            stw.WriteLine("1.qtite allouée ?: " + C_S.ReceiveBufferSize.ToString());
     
            C_S.ReceiveBufferSize = buffer.Length;
            stw.WriteLine("2.qte reçue: " + C_S.Available.ToString());
            stw.WriteLine("2.Connectée ?: " + C_S.Connected.ToString());
            stw.WriteLine("2.Bloquée ?: " + C_S.Blocking.ToString());
            stw.WriteLine("2.Bounded ?: " + C_S.IsBound.ToString());
            stw.WriteLine("2.Local endpoint ?: " + C_S.LocalEndPoint.ToString());
            stw.WriteLine("2.qtite allouée ?: " + C_S.ReceiveBufferSize.ToString());
            //stw.WriteLine(C_S.Available.ToString());
     
            //try
            //{
            while (C_S.Available > 0)
            {
                try
                {
                    count = C_S.Receive(buffer);
                }
                catch (SocketException e)
                {
                    new Error(this.SID, this.PORT.ToString()).WriteError(e.Message);
                }
                stw.WriteLine("Count:" + count.ToString());
                stw.Write(Encoding.ASCII.GetChars(buffer));
     
            }
            stw.Close();    
            stw.Dispose();    
            fs.Close();    
            fs.Dispose();
        }
    J'obtiens dans le fichier les sonnées suivantes:


    1.qte reçue: 8192
    1.Connectée ?: True
    1.Bloquée ?: True
    1.Bounded ?: True
    1.Local endpoint ?: 127.0.0.1:5749
    1.qtite allouée ?: 8192
    2.qte reçue: 4096
    2.Connectée ?: True
    2.Bloquée ?: True
    2.Bounded ?: True
    2.Local endpoint ?: 127.0.0.1:5749
    2.qtite allouée ?: 4096
    On voit bien que des données sont présentent dan sle socket. Mais je n'arrive pas à les récupérées ????

    Pourquoi donc ??
    Y a un problème avec C_S.receive(...)
    Est-ce que cette opération est bloquante ??!!!

    merci pour votre aide !
    tout le monde est d'accord pour critiquer la pensée unique

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bon bah finalement,
    je suis passé par la classe TCPClient.
    ça fonctionne sauf que j'arrive pas à détecter la fin d'un transfert de fichier côté serveur ...
    _myClient.Available > 0 ?
    _myClient.Connected == true ?

    Rien de tout ça n'a l'air satisfaisant !
    tout le monde est d'accord pour critiquer la pensée unique

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/05/2012, 16h18
  2. Transmission d'une ArrayList via Socket
    Par Illuminati dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 26/11/2010, 14h44
  3. Transmission/Réception partielle de structure via socket
    Par Djakisback dans le forum Réseau
    Réponses: 39
    Dernier message: 11/12/2009, 10h57
  4. [FLASH MX2004] [XMLSocket] Problème avec serveur socket php
    Par cocodunombril dans le forum Flash
    Réponses: 4
    Dernier message: 03/04/2009, 02h10
  5. Réponses: 0
    Dernier message: 06/03/2009, 21h31

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