Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bloqué dans la fonction recvfrom() ?

    14 décembre 2022 à 10:13:25

    Bonjour,

    Dans le cadre d'un projet d'études, J'aimerais essayer de récupérer des données provenant d'une source qui envoie des données par protocole UDP avec une adresse et un port. Ainsi, j'ai repris un programme en c++ afin de récupérer les données via le port 3000 mais je ne récupère aucune donnée puisque le programme reste bloqué dans la fonction rcvfrom().

    Ainsi, j'ai regardé si la source envoyé des données via le resource monitor. Ainsi, elle envoie bien des données (send 400B/s). Je n'ai également pas d'erreur à la connexion au port correspondant.

    Voici le code c++ ci-dessous :

    #include <winsock2.h> // pour les fonctions socket
    #include <cstdio> // Pour les Sprintf
     
    #pragma comment(lib,"ws2_32.lib")
     
     
    WSADATA initialisation_win32; 
    int erreur;
    int tempo; 
    int nombre_de_caractere; 
    char buffer[65535]; 
    SOCKET id_de_la_socket; 
    SOCKADDR_IN information_sur_la_source; 
     
    int main (int argc, char* argv[])
    	{
    	printf("\nEcoute du port 3000\n");
     
    	erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
    	if (erreur!=0)
    		printf("\nDesole, je ne peux pas initialiser Winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
    	else
    		printf("\nWSAStartup  : OK");
     
    	id_de_la_socket=socket(AF_INET,SOCK_DGRAM,0);
    	if (id_de_la_socket==INVALID_SOCKET)
    		printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d",WSAGetLastError());
    	else
    		printf("\nsocket      : OK");
     
    	information_sur_la_source.sin_family=AF_INET; 
    	information_sur_la_source.sin_addr.s_addr=INADDR_ANY;
    	information_sur_la_source.sin_port=htons(3000); // Ecoute sur le port 3000
    	erreur=bind(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,sizeof(information_sur_la_source));
    	if (erreur!=0)
    		printf("\nDesole, je ne peux pas ecouter ce port, code d'erreur : %d %d",erreur,WSAGetLastError());
    	else
    		printf("\nbind        : OK");
     
    	tempo=sizeof(information_sur_la_source); 
    	printf("\nbefore recvfrom");
    	nombre_de_caractere=recvfrom(id_de_la_socket,buffer,1024,0,(struct sockaddr*)&information_sur_la_source,&tempo);
    	printf("\nafter recvfrom");
    	buffer[nombre_de_caractere]=0; 
    	printf("\nVoici les donnees : %s",buffer);
     
    	erreur=closesocket(id_de_la_socket);
    	if (erreur!=0)
    		printf("\nDesole, je ne peux pas liberer la socket du a l'erreur : %d %d",erreur,WSAGetLastError());
    	else
    		printf("\nclosesocket : OK");
     
    	erreur=WSACleanup(); 
    	if (erreur!=0)
    		printf("\nDesole, je ne peux pas liberer winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
    	else
    		printf("\nWSACleanup  : OK");
    	}


    Merci d'avance

    -
    Edité par Sejiii 14 décembre 2022 à 10:35:20

    • Partager sur Facebook
    • Partager sur Twitter
      14 décembre 2022 à 11:03:46

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        15 décembre 2022 à 13:33:40

        Montre le code client, ce code serveur me parait juste.

        Notes subjectives :

        • Code en anglais
        • Rajoute un peu d'espaces entre les lignes
        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          15 décembre 2022 à 15:43:23

          Malheureusement je n'ai pas accès au code client, j'ai juste une interface sur laquelle je peux changer l'ip, le port et la fréquence d'envoi. En utilisant wireshark, j'ai pu voir que les données étaient bien envoyés sur l'ip et le port que j'avais choisi avec le protocole UDP. Le programme a fonctionné une seule fois sans changement particulier. Et je n'ai pas réussi à trouver les raisons de pourquoi il a fonctionné.

          -
          Edité par Sejiii 15 décembre 2022 à 16:02:07

          • Partager sur Facebook
          • Partager sur Twitter
            15 décembre 2022 à 21:38:31

            Initialisez correctement les structures. (BIS)
            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              16 décembre 2022 à 9:43:06

              J'ai essayé d'utiliser la fonction ZeroMemory afin d'initialiser la structure mais je n'ai pas reçu les données.

              Est ce que je l'ai utilisé de la bonne manière ?

              #include <winsock2.h> // pour les fonctions socket
              #include <cstdio> // Pour les Sprintf
              
              #pragma comment(lib,"ws2_32.lib")
              
              
              WSADATA initialisation_win32; 
              int erreur;
              int tempo; 
              int nombre_de_caractere; 
              char buffer[65535]; 
              SOCKET id_de_la_socket; 
              SOCKADDR_IN information_sur_la_source; 
              
              int main (int argc, char* argv[])
              	{
              	printf("\nEcoute du port 50150\n");
              
              	erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
              	if (erreur!=0)
              		printf("\nDesole, je ne peux pas initialiser Winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
              	else
              		printf("\nWSAStartup  : OK");
              
              	id_de_la_socket=socket(AF_INET,SOCK_DGRAM,0);
              	if (id_de_la_socket==INVALID_SOCKET)
              		printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d",WSAGetLastError());
              	else
              		printf("\nsocket      : OK");
              	ZeroMemory(&information_sur_la_source,sizeof(information_sur_la_source));
              	information_sur_la_source.sin_family=AF_INET; 
              	information_sur_la_source.sin_addr.s_addr=INADDR_ANY;
              	information_sur_la_source.sin_port=htons(50150); // Ecoute sur le port 50150
              	erreur=bind(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,sizeof(information_sur_la_source));
              	if (erreur!=0)
              		printf("\nDesole, je ne peux pas ecouter ce port, code d'erreur : %d %d",erreur,WSAGetLastError());
              	else
              		printf("\nbind        : OK");
              
              	tempo=sizeof(information_sur_la_source); 
              	printf("\nbefore recvfrom");
              	nombre_de_caractere=recvfrom(id_de_la_socket,buffer,1024,0,(struct sockaddr*)&information_sur_la_source,&tempo);
              	printf("\nafter recvfrom");
              	buffer[nombre_de_caractere]=0; 
              	printf("\nVoici les donnees : %s",buffer);
              
              	erreur=closesocket(id_de_la_socket);
              	if (erreur!=0)
              		printf("\nDesole, je ne peux pas liberer la socket du a l'erreur : %d %d",erreur,WSAGetLastError());
              	else
              		printf("\nclosesocket : OK");
              
              	erreur=WSACleanup(); 
              	if (erreur!=0)
              		printf("\nDesole, je ne peux pas liberer winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
              	else
              		printf("\nWSACleanup  : OK");
              	}



              -
              Edité par Sejiii 16 décembre 2022 à 9:46:01

              • Partager sur Facebook
              • Partager sur Twitter
                16 décembre 2022 à 19:09:57

                >Est ce que je l'ai utilisé de la bonne manière ?

                Oui et Non.

                Oui, vous l'utilisez de la bonne manière.

                Non, vous n'utiliser pas systématiquement.

                "WSADATA" c'est aussi une structure.

                Je fais une fixette sur l"utilisation de "ZeroMemory" car cela explique souvent des trucs comme ça :

                >Le programme a fonctionné une seule fois sans changement particulier. Et je n'ai pas réussi à trouver les raisons de pourquoi il a fonctionné.

                Quand votre programme client "tourne", netstat l'affiche ?

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                Bloqué dans la fonction recvfrom() ?

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown