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