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

Visual C++ Discussion :

Problème TCPListener, Sockets : Une seule donnée reçue


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Problème TCPListener, Sockets : Une seule donnée reçue
    Bonjour à tous,
    j'ai un projet windows forms qui est censé communiquer avec un autre projet (Ogre 3D).
    Du côté windows forms j'ai utilisé la classe du .net framework TCPListener pour créer mon serveur qui sert à écouter et recevoir les données envoyées par le client.
    Server:
    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
    ref class leserver
    {
    public:
    	 void travail()
       {
     
    System::Net::IPAddress^ ipAddress = System::Net::Dns::Resolve( "127.0.0.1" )->AddressList[ 0 ];
     
    TcpListener^ tcpListener = gcnew TcpListener( ipAddress,1300 );
     
    tcpListener->Start(1);
    array<Byte>^bytes = gcnew array<Byte>(256);
    while (true){
    Thread::Sleep(100);
    TcpClient^ client =tcpListener->AcceptTcpClient();
    NetworkStream^ stream = client->GetStream();
    stream->Read( bytes, 0, bytes->Length );
    //MessageBox::Show(System::Text::Encoding::ASCII->GetString(bytes));
    donnee=(System::Text::Encoding::ASCII->GetString(bytes));
    bytes->Clear(bytes,0,30);
    }
       }
    	 System::String^ donnee;
     
    };
    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
    #include <winsock2.h>
    class leclient
    {
    public:
    void initetconnect()
       {
     
    	WSAStartup(MAKEWORD(2,0), &WSAData);
    	sin.sin_addr.s_addr	= inet_addr("127.0.0.1");
    	sin.sin_family		= AF_INET;
    	sin.sin_port		= htons(1300);
    	sock = socket(AF_INET,SOCK_STREAM,0);
    	bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
    	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     
    	 }
    void envoi(const char* donnee ){
    	send(sock, donnee, 30, 0); 
    	 }
     
    	WSADATA WSAData;
    	SOCKET sock;
    	SOCKADDR_IN sin;
     
    	};
    le hic est que je reçois tout le temps la même chose sur le serveur alors que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    i=0;
    -debutboucle
    ...
    	|	i++;
    	|	monclient.envoi(Ogre::StringConverter::toString(i).c_str());
    ...
    -finboucle

    la boucle marche bien et le i est bien incrémenté (j'ai vérifié côté client) mais du côté server je reçois toujours la première donnée uniquement, c'est à dire que quand i est initialisé à 0, je ne reçois que des 1 tout le temps alors que je voudrais recevoir 1,2,3...
    quelqu'un peut-il m'expliquer pourquoi?

    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Je précise que le serveur écoute en parallèle avec l'exécution du logiciel grâce à un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    serv=gcnew leserver;
     
    ThreadStart^ threadDelegate=gcnew ThreadStart(serv,&leserver::travail);
     
    Thread^ newThread = gcnew Thread(threadDelegate); // création du thread
    newThread->Start();
    timer2->Enabled=true;
    est-ce que la modification de la "donnee" du serveur par un thread joue un rôle dans le problème? car l'affichage de la donnee reçue se fait dans le timer 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textPosX->Text=serv->PositionX;

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Cela vient de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int32 bytes = stream->Read( data, 0, data->Length );
    qui lit la premiere ligne



    Je cherche aussi la soluce

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/11/2009, 18h51
  2. Modifier une seule donnée spécifique.
    Par amerex dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/07/2008, 02h23
  3. Réponses: 6
    Dernier message: 11/02/2008, 14h48
  4. une seule donnée
    Par yousron dans le forum Access
    Réponses: 1
    Dernier message: 09/01/2007, 15h02
  5. [MSSQL] Problème pour sélectionner une seule occurence
    Par Tinfolley dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/07/2004, 10h02

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