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");
}
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é.
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");
}
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 ?
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.
git is great because Linus did it, mercurial is better because he didn't.