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 :

Socket entre C++ et C#


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    244
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 244
    Points : 159
    Points
    159
    Par défaut Socket entre C++ et C#
    Bonjour à tous,

    J'ai un problème et après pas mal de recherche (peut etre pas les bonne) j'en viens à poster ici.

    En C++, je veux envoyer ceci sur un socket avec mon serveur c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(socket, "Message2" ,sizeof("Message2"));
    Et en c# j'essaye de récuperer ce "Message2". Mais je n'arrive à rien.

    Voici ce que j'ai essayé :
    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
     
    NetworkStream ns = new NetworkStream(currentSocket);
                BinaryReader bn = new BinaryReader(ns);
     
                string data ="";
                try
                {
                    int count = (int)bn.ReadByte();
     
                    Console.WriteLine("Count : " + count);
     
                    StringBuilder builde = new StringBuilder();
     
                    Console.WriteLine(bn.PeekChar());
                    while (bn.PeekChar() > -1)
                    {
                        Console.WriteLine("on append");
                        builde.Append(bn.ReadString());
                    }
     
                    Console.WriteLine("Data : " + data);
     
                    bn.Close();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
    Avez vous une idée de comment faire ? En sachant que PeekChar me renvoi toujours -1, et si je fais un bn.ReadString() j'ai un message :
    Impossible de lire au dela du flux.
    Merci d'avance

    Nathan

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    t'as peut-etre un soucis de connexion entre tes 2 sockets

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    244
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 244
    Points : 159
    Points
    159
    Par défaut
    Je viens de passer via un StreamReader et ça a l'air de fonctionner.

    Sauf que mon C++ en utilsant "write()" demande du "const void(*)" et moi j'ai du "string".

    Me manque plus qu'a trouver comment convertir le string en const void(*) et en theorie ce sera bon.

    Si je passe direct "toto" dans le "write()", ça fonctionne.

  4. #4
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut.
    Moi je vois plusieurs problèmes.
    déjà, bn.ReadByte() ne retourne pas le nombre d'octets présents dans le flux. Ça retourne le premier octet, autrement dit, normalement le code ASCII de ton 'M' dans l'exemple que tu donnes. Si en réalité ton code écris juste une lettre, alors le ReadByte consume toutes les données du flux.

    Ensuite, tu ne vérifies pas si tu as reçus des données. Il ne faut pas oublier que là tes données traversent un réseau, il y a de la latence, des risques de perte de connexion/de données, etc...
    Surtout que le message dit que tu ne peux pas lire au delà du flux, ce qui semble indiquer qu'il n'y à pas de données dans le flux (confirmé par les PeekChar qui retournent -1).

    Tu utilises un BinarryReader par dessus un NetworkStream alors que celui-ci fournit déjà les méthodes de lecture/écriture par octet.

    Enfin, tu oublies également qu'un char en .Net n'est pas un char en C++, de même, un string en .Net n'est pas un char* (ou char[]) en C++.

    Du coup, compte tenus de tout ça, voilà comment on lit un NetworkStream d'après la MSDN :

    Code C# : 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
     
    // Check to see if this NetworkStream is readable.
    if(myNetworkStream.CanRead){
        byte[] myReadBuffer = new byte[1024];
        StringBuilder myCompleteMessage = new StringBuilder();
        int numberOfBytesRead = 0;
     
        // Incoming message may be larger than the buffer size.
        do{
             numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0,  myReadBuffer.Length);
     
             myCompleteMessage.AppendFormat("{0}",  Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
     
        }
        while(myNetworkStream.DataAvailable);
     
        // Print out the received message to the console.
        Console.WriteLine("You received the following message : " +
                                     myCompleteMessage);
    }
    else{
         Console.WriteLine("Sorry.  You cannot read from this  NetworkStream.");
    }

    Au passage, il manque également les usings sur les streams.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    244
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 244
    Points : 159
    Points
    159
    Par défaut
    Merci pour ta réponse.

    J'ai trouvé une solution pas tout a fait identique.

    Je la met ici au cas ou quelqu'un d'autre aurait ce soucis :

    Le serveur :
    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
    NetworkStream ns = new NetworkStream(currentSocket);
                StreamReader sr = new StreamReader(ns);
               // BinaryReader bn = new BinaryReader(ns);
     
                string data;
                try
                {
                    bool fin = false;
     
                    while (((data = sr.ReadLine()) != null) && (fin==false))
                    {
                        Console.WriteLine(data);
                        if (data.Contains("fin"))
                        {
                            fin = true;
                        }
                    }
     
                    sr.Close();
                }
    Le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    diskUsage = "Disk:"+readReturnFile()+"\n";
     
    	write(socket, diskUsage.c_str() ,strlen(diskUsage.c_str()));
    Ainsi cela fonctionne très bien.

    A bientot

  6. #6
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Il manque toujours les usings sur les streams. Ce n'est pas parce que ca fonctionne bien pendant ton teste que c'est bien fait pour autant ni que ca fonctionnera toujours. Les usings sont important.

    Au passage, je reviens un peu sur ton message d'avant :
    Sauf que mon C++ en utilsant "write()" demande du "const void(*)" et moi j'ai du "string".

    Me manque plus qu'a trouver comment convertir le string en const void(*) et en theorie ce sera bon.
    Ce message indique que tu ne connais pas certaines bases du C et du C++, a moins que tu ne te sois mal exprimé. J'hésite un peu entre les deux vu que tu as correctement utilisé la méthode c_str, mais que tu as utilisé strlen au lieu de la méthode approprié.
    J'ai l'impression que tu ne fais pas la différence entre le C et le C++ et que tu n'a pas de vrais notion de gestion de la mémoire dans ces langages. Peut-être n'est-ce qu'une impression, je ne connais pas ton niveau dans ces langages, mais dire que tu ta fonction attend un "const void*" et que toi tu as un "string" et donc qu'il faut convertir l'un en l'autre, ca me paraît plus que bancale.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    244
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 244
    Points : 159
    Points
    159
    Par défaut
    Tu as bien raison ^^

    J'ai commencé le C/C++ il y a 4 jours. Je dois donc surement faire pas mal de choses bancales ^^

    Merci pour tes conseils en tout cas, je vais essayer d'améliorer le code.

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

Discussions similaires

  1. Partage de Socket entre processus
    Par Maerlyn dans le forum Réseau
    Réponses: 3
    Dernier message: 16/06/2008, 13h57
  2. [socket ] entre linux et windows
    Par untipy dans le forum Réseau
    Réponses: 7
    Dernier message: 29/08/2007, 14h10
  3. Réponses: 5
    Dernier message: 29/03/2007, 22h26
  4. prob de socket entre mysql et phpMyAdmin
    Par ratafia dans le forum Outils
    Réponses: 5
    Dernier message: 23/08/2006, 10h07
  5. Réponses: 3
    Dernier message: 30/03/2004, 09h38

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