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 :

Bloqué dans la fonction rcvfrom() ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    étudiant en ingénierie
    Inscrit en
    Septembre 2022
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : étudiant en ingénierie
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2022
    Messages : 9
    Par défaut Bloqué dans la fonction rcvfrom() ?
    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 :
    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
    #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.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 507
    Par défaut
    Votre code, c'est du C, pas du C++.
    Il n'y a pas de connexion en UDP.

    resource monitor.
    Précisez, SVP.

    Vérifiez via une commande type netstat s'il n'y a pas déjà un programmeur écoutant sur ce port UDP.
    Vérifiez que le programmeur émetteur utilise une adresse IP correspondant à l'hôte de votre programme client.
    Vérifiez la configuration des différents firewall.
    Utilisez un moniteur réseau, comme Wireshark, sur la machine cliente pour voir précisément ce qui arrive sur la machine hôte du client.

    P.S.: Initialisez correctement vos structures en utilisant ZeroMemory puis en initialisant TOUS les champs nécessaires.

  3. #3
    Membre habitué
    Homme Profil pro
    étudiant en ingénierie
    Inscrit en
    Septembre 2022
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : étudiant en ingénierie
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2022
    Messages : 9
    Par défaut
    Merci pour votre réponse. J'ai en effet regardé avec le resource monitor qui se trouve sous windows s'il y avait d'autres programmeurs écoutant sur le même port, ce qui n'est pas le cas. Je n'ai pas accès au programme de l'émetteur, j'ai juste une interface qui me permet de changer l'adresse IP et le port.

    J'ai plusieurs questions pour les vérifications :
    -Est ce qu'il fallait mettre dans le programme client l'ip du programme émetteur ?
    -Qu'est ce qu'il faut vérifier dans les configurations du firewall ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre habitué
    Homme Profil pro
    étudiant en ingénierie
    Inscrit en
    Septembre 2022
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : étudiant en ingénierie
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2022
    Messages : 9
    Par défaut
    Oui elle est bloquante tant qu'elle ne reçoit pas de données.
    Mais le problème est que je ne sais pas pourquoi je ne reçoit aucune donnée.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 507
    Par défaut
    Mais le problème est que je ne sais pas pourquoi je ne reçoit aucune donnée.
    J'ai donné un bon nombre de possibilités du "pourquoi".
    Le plus simple, c'est de voir avec un sniffer réseau ce qui est vraiment envoyé à la carte réseau de votre machine.
    Si votre machine ne reçoit pas les paquets, vous pouvez faire toutes les gesticulations possibles avec votre programme, ça servira à rien.

Discussions similaires

  1. [WD-2013] Problème d'objet "range" plein qui me bloque dans ma fonction.
    Par jvqt31 dans le forum VBA Word
    Réponses: 0
    Dernier message: 23/04/2018, 13h44
  2. l'execution bloqué dans une fonction
    Par étoile de mer dans le forum Débuter
    Réponses: 7
    Dernier message: 30/09/2008, 08h48
  3. Fonction déconnexion bloquée dans le menu kde
    Par Scrognegne dans le forum Administration système
    Réponses: 3
    Dernier message: 17/08/2008, 10h32
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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