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++Builder Discussion :

Reception de packet UDP


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Par défaut Reception de packet UDP
    Salut,
    J'utilise le composant TUDPSocket pour envoyer et recevoir des packets UDP,
    l'envoi se fait sans problème mais la réception pose problème, Je ne reçois par les données pourtant elle sont bien présente sur le réseau.
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::UdpSocket1Receive(TObject *Sender, PChar Buf,
          int &DataLen)
    {
          AnsiString Trame;
           UdpSocket1->ReceiveBuf(Trame,UdpSocket1->BytesReceived,1);
          Memo1->Text=IntToStr(Trame.Length());//Affichage de la longueur des donnés
          Memo3->Lines->Add("Donnée recues "+Trame);//Affichage datas
    }
    Ça à l'air tout con et pourtant je bute dessus donc j'implore votre aide lol
    Merci d'avance
    cordialement.

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut taquilla, j'ai trouvé du code qui pourrais peut-être t'aider, alors le voici:

    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
    BYTE buffer[4096];
     
    Memo1->Clear();
    UdpSocket1->Connect();
    Memo1->Lines->Add(" Local " + String(UdpSocket1->LocalPort) + " Remote " + String(UdpSocket1->RemotePort));
    //...
    int NumRead = UdpSocket1->ReceiveBuf(buffer, sizeof(buffer), 0);
    if( NumRead >= sizeof(DataHeader) )
    {
        DataHeader *pHdr = (DataHeader*)buffer;
     
        Memo1->Lines->Add(String(5000+pHdr->sender)+" "+
            String(pHdr->msgId)+" "+String(pHdr->msgLen)+" "+
            String(NumRead-sizeof(DataHeader)));
    }
    PS: J'ai pas testé

  3. #3
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Par défaut
    Merci de ta réponse
    mais malheureusement il ne fonctionne pas
    A+

  4. #4
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TForm1::UdpSocket1Receive(TObject *Sender, PChar Buf,
          int &DataLen)
    {
     
     
     
    }
    En réalité il n'y a pas d'événement qui arrive, donc la routine ne peut pas s'exécuter.
    Par contre pour l'envoi, il y a bien un événement qui est envoyé .
    J'ai regardé plusieurs exemples sur le net, et ils utilisent plus ou moins la même technique et apparemment je suis pas le seul à avoir ce souci .
    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Bonjour bonjour,
    j'ai exactement le même problème sous Delphi 7, et je viens de m'inscrire à l'instant pour demander de l'aide, après avoir cherché autant que je pouvais.

    J'utilise le socket UDP fourni dans Delphi 7.

    C'est exactement pareil : mes trames envoyées sont bien sur le réseau, un événement d'envoi est bien activé, mais pas l'événement de réception. Je vais lire avec attention vos réponses, en espérant une solution !
    (ah pardon : je vois que je fais remonter une ancienne discussion, qui date de l'année dernière ; désolé)

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Par défaut
    Salut,
    non non la discution est bien récente, je sais qu'avec delphi ont n'a les mêmes composants, par contre il y a beaucoup plus d'exemples, je me suis basé dessus pour essayer de résoudre mon problème mais c'est toujours pareil.
    Je te tiens au courant si je trouve quelque chose
    A+

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Par défaut
    Bonjour,

    D'accord avec toi Guyt54. Faut juste adatper. D'ailleur merci pour ton forum sur lequel j'étais tombé (aie) et dont je m'étais inspiré.

    Merci aux autres pour vos précisions, j'ai matière à réfléchir maintenant.
    Y a plus qu'à, surtout coté Thread ?!? Mais pas tout saisi :puisqu'il y aurait un thread qui scrute si y a quelques choses à lire, pourquoi waitfordata?

    Je vous tiens au courant de ma solution trouvé qu'on ferme ce topic une bonne fois pour toute ! ;-)

    Bonne journée

  8. #8
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    en tout cas, festinno, il est motivant, ton post.

    je travaille depuis hier à l'écriture d'un UDP socket, comme je m'en doutais, c'est pas évident.

    Là, je viens de tomber là-dessus:

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Tu regarderas l'exemple, pour une fois que Microsoft nous en donne un pas mal.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    YES!!!!!!!!!!!!!!!!


    J'ai adapté l'exemple de microsoft. c'est très lourd pour l'instant, mais la transmission UDP fonctionne, ça nous donne une bonne base de travail pour faire du code plus intelligent.
    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
     
    AnsiString UdpSend(AnsiString data, AnsiString ipAddr, int port)
    // http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625%28v=vs.85%29.aspx
    {
        AnsiString mes ;
        int iResult ;
     
        // Initialize Winsock
        WSADATA wsaData;
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != NO_ERROR)
        {
            mes.sprintf("WSAStartup function failed with error: %d",iResult) ;
            return mes ;
        }
     
        // Create a SOCKET for connecting to server
        SOCKET ConnectSocket;
        ConnectSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if (ConnectSocket == INVALID_SOCKET)
        {
            mes.sprintf("socket function failed with error: %ld", WSAGetLastError());
            WSACleanup();
            return mes ;
        }
     
        // The sockaddr_in structure specifies the address family,
        // IP address, and port of the server to be connected to.
        sockaddr_in clientService;
        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr(ipAddr.c_str());
        clientService.sin_port = htons(port);
     
         // Connect to server.
        iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
        if (iResult == SOCKET_ERROR)
        {
            mes.printf("connect function failed with error: %ld", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return mes ;
        }
        // Send data
         send(ConnectSocket,data.c_str(),data.Length(),0) ;
         ShowMessage("data transmitted") ;
        // Close
        closesocket(ConnectSocket);
        WSACleanup();
        return "DONE!!!" ;
    }
    Je regarde côté réception, maintenant.

    C'est vraiment mon jour de chance:

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    et aussi:
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    finalement:
    http://www.win32developer.com/tutori...utorial_3.shtm

  10. #10
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Bon, le UDP en réception fonctionne (mode non-blocking).

    Encore une fois, du code adapté à partir d'un exemple de Microsoft:

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    AnsiString UdpGet(int listenPort,AnsiString& rxData, AnsiString& ipAddr, int& port)
    // recvfrom failed with error 10035
    {
        AnsiString mes ;
        int iResult ;
     
        // Initialize Winsock
        WSADATA wsaData;
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != NO_ERROR)
        {
            mes.sprintf("WSAStartup function failed with error: %d",iResult) ;
            return mes ;
        }
     
        // Create a receiver socket to receive datagrams
        SOCKET RecvSocket ;
        RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (RecvSocket == INVALID_SOCKET)
        {
           mes.sprintf("socket function failed with error: %ld", WSAGetLastError());
           WSACleanup();
           return mes ;
        }
        // Set to non-blocking mode
    	   u_long iMode=1;   // If iMode!=0, non-blocking mode is enabled.
    	   ioctlsocket(RecvSocket,FIONBIO,&iMode);
     
        // Bind the socket to any address and the specified port.
        sockaddr_in RecvAddr;
        RecvAddr.sin_family = AF_INET;
        RecvAddr.sin_port = htons(listenPort);
        RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
        if (iResult != NO_ERROR)
        {
            mes.printf("bind failed with error %d\n", WSAGetLastError());
            closesocket(RecvSocket);
            WSACleanup();
            return mes ;
        }
       // Ready to read data
       char RecvBuf[256] ;
       int  BufLen = 255 ;
       int  DataCount ;
       sockaddr_in SenderAddr;
       int SenderAddrSize = sizeof(SenderAddr) ;
       // tell user to send data in modal ok dialog
       ShowMessage("Ready to receive data, press ok when data transmitted (or not!)") ;
       // read data
       int retries = 0 ;
       do
       {
         DataCount = recvfrom(RecvSocket,RecvBuf, BufLen, 0,
                             (SOCKADDR*)&SenderAddr, &SenderAddrSize);
         retries++  ;
         Sleep(1000) ;
       }
       while (DataCount < 0  && retries < 5) ;
       if (DataCount > 0)  // -1  if error
       {
         RecvBuf[DataCount] = 0 ;
         rxData = AnsiString(RecvBuf) ;
         mes = "OK" ;
       }
       else
       {
         mes.sprintf("recvfrom failed with error %d", WSAGetLastError()) ;
       }
       // Close
       closesocket(RecvSocket);
       WSACleanup();
       return mes ;
    }
    Reste plus qu'à intégrer tout ça dans un composant facile d'utilisation, la roue aura été réinventée, mais le UDP démystifié.

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Par défaut
    Salut,

    pas si lourd que ca le code à intégrer, assez facile de compréhension une fois qu'on l'a sous les yeux, mais ce n'est pas une démarche que j'aurai inventé.

    Merci pour les explications et les liens associés (aussi important).

    Pour ma part, l'envoi UDP fonctionne aussi très bien avec winsock, comme j'avais pu le faire en utilisant une instance de TUDPSocket.

    Par contre j'ai quelques soucis encore avec la réception de données...
    affaire à suivre...

    En tout cas merci pour les exemples Guyt54 et MS un peu aussi. ;-)

Discussions similaires

  1. Comment connaitre la taille d'un packet UDP ?
    Par Djobird dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 16/07/2009, 16h58
  2. probleme de reception de message udp apres envoi
    Par zarbiman dans le forum Développement
    Réponses: 2
    Dernier message: 12/12/2007, 23h21
  3. Problème de packet UDP avec les routeurs
    Par Thixomag dans le forum Développement
    Réponses: 16
    Dernier message: 11/11/2007, 20h38
  4. Checksum d'un packet udp
    Par sebastien.mz dans le forum Réseau
    Réponses: 3
    Dernier message: 12/05/2007, 15h00
  5. récupérer la taille d'un packet UDP
    Par beLz dans le forum Réseau
    Réponses: 17
    Dernier message: 07/03/2007, 11h50

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