Menu

Lire les données envoyées par un serveur

Messages postés
53
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
29 mai 2019
-
Bonjour,

J'ai un capteur qui va envoyer à notre Systeme un fichier XML ( le capteur envoie un requete POST http qui contienne le text xml vers une adresse ip et un port spécifics) . Du coup mon problème est que je ne sais pas comment je pourrais lire ces données envoyées par le POST . J'ai essayé avec un socket TCP ( une adresse ip et un port spécifics) mais le recv ne m'a rien retourné. Aves-vous une idée svp?

char buffer[1024] = "";
int nOctetsRecus = 0;
int nOctetsEnvoyes = 0;
int tailleBuffer = 0;
int boucle = 1;
char * URL;
char * xml_data;
nOctetsRecus = 0;
nOctetsEnvoyes = 0;
tailleBuffer = 0;
boucle = 1;

//STEP1: Initialisation Winsock
iwsaStartup = WSAStartup(MAKEWORD(2,2), &winSockData);
if (iwsaStartup != 0)
{
printf("APICP: open_socket(): WSAStratup Failed\r\n");
}
//LOG_INFO("APICP: opensocket(): WSAStarup Success\r\n");

//STEP3: Socket TCPSocketClient Creation
TCPSocketClient = socket(AF_INET, SOCK_STREAM, 0);
if (TCPSocketClient == INVALID_SOCKET)
{
printf("Socket creation failed with error: %d\r\n", WSAGetLastError());
WSACleanup();
return 1;
}
//printf("La socket %d est ouverte en TCP/IP.\n", TCPSocketClient);
// on configure l'interface de connexion
IRMAServer.sin_addr.s_addr = inet_addr(Addr_TCP_OBU); // adresse IP du serveur IRMA
IRMAServer.sin_family = AF_INET;
IRMAServer.sin_port = htons(49668); // sin_port et sin_addr doivent être en Network Byte Order // htons() convertit
//un entier court depuis l'ordre des octets de l'hôte vers celuidu réseau (host to network short)
//printf("Connexion a %s sur le port %d\n", inet_ntoa(IRMAServer.sin_addr), htons(IRMAServer.sin_port));
if(connect(TCPSocketClient, (SOCKADDR*)&IRMAServer, iIRMAServerLen) != SOCKET_ERROR) // si le client réussit à se connecter au serveur
printf("Connexion a %s sur le port %d\n", inet_ntoa(IRMAServer.sin_addr), htons(IRMAServer.sin_port));
else
printf("Erreur de connexion.");

//printf("buffer ");
recv(TCPSocketClient, buffer, 2048,0);
printf("buffer =%s", buffer);
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
5131
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juin 2019
777
1
Merci
Salut emmy_2019,

Si ton programme doit recevoir une requête http POST, ton programme doit faire fonctionner un serveur et non pas un client.

https://docs.microsoft.com/en-us/windows/desktop/winsock/complete-server-code

Après, tu devras parser la requête http et renvoyer une réponse... ce n'est pas un travail trivial.

Tu peux commencer par lire ceci :

https://medium.com/from-the-scratch/http-server-what-do-you-need-to-know-to-build-a-simple-http-server-from-scratch-d1ef8945e4fa

(cela utilise les sockets Unix, mais abstraction faite de cela, l'article est bien expliqué)

En plus de gérer les requêtes http, tu devras décoder les données reçues et parser le JSON.

Dal

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 42982 internautes nous ont dit merci ce mois-ci

emmy_2019
Messages postés
53
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
29 mai 2019
> [Dal]
Messages postés
5131
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juin 2019
-
Dal le return cp ne va jamais passer car j'ai un boucle while(1) :

cp = malloc(sizeof(Comptage) * 1024);
while(1)
{
AcceptSocket = accept(ListenSocket, (struct sockaddr*)&IRMAClient, &iIRMAClientLen);

if (AcceptSocket == INVALID_SOCKET)

{

LOG_INFO("Server: accept() error %d\n", WSAGetLastError());

WSACleanup();

}

else

LOG_INFO("Server: accept() is OK.\n");

LOG_INFO("Server: accepted connection from %s, port %d\n", inet_ntoa(IRMAClient.sin_addr), htons(IRMAClient.sin_port)) ;


iResult = recv(AcceptSocket, recvbuf, 1024, 0);
//time (&rawtime);
//timeinfo = localtime (&rawtime);

//strftime (buffer,80,"%Y%m%d-%X",timeinfo);

if (iResult == SOCKET_ERROR)

{

LOG_INFO("Server: recv() failed: error %d\n", WSAGetLastError());

closesocket(AcceptSocket);

continue;

}

else

LOG_INFO("Server: recv() is OK.\n");

if (iResult == 0)

{

printf("Server: Client closed connection.\n");

closesocket(AcceptSocket);

continue;

}
if (cp == NULL)
return NULL;

GetLocalTime(&st);
sprintf(Count_Pass[count].Heure, "%04d%02d%02d-%02d:%02d:%02d" ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
GetXmlTagValue(recvbuf,"DoorID",Tag1,TagValue);
GetXmlTagValue(recvbuf,"In",Tag1,TagValue1);
GetXmlTagValue(recvbuf,"Out",Tag1,TagValue2);
cp[count].ID = atoi(TagValue);
cp[count].Nombre_Mont = atoi(TagValue1);
cp[count].Nombre_Desc = atoi(TagValue2);
LOG_INFO("Server: \n Time = %s \n ID= %d \nNombre_Mont =%d \n Nombre_Desc = %d ", cp[count].Heure, cp[count].ID, cp[count].Nombre_Mont, cp[count].Nombre_Desc);


//LOG_INFO("Memmcpy: \n Time = %s \n ID= %d \nNombre_Mont =%d \n Nombre_Desc = %d ", Count_Pass[i].Heure, Count_Pass[i].ID, Count_Pass[i].Nombre_Mont, Count_Pass[i].Nombre_Desc);
send(AcceptSocket, reply, strlen(reply), 0);
LOG_INFO("%s\n",reply);
LOG_INFO("Server: I'm waiting more connection, try running the client\n");
LOG_INFO("Server: program from the same sensor or other sensor...\n");
count++;
continue;
}
return cp;
[Dal]
Messages postés
5131
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juin 2019
777 -
note que ta question actuelle n'a pas grand chose à voir avec ta question initiale, et qu'il aurait été mieux que tu postes un nouveau sujet avec un intitulé explicite par rapport à ton nouveau problème :-)
[Dal]
Messages postés
5131
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juin 2019
777 -
tu postes à nouveau sans coloration syntaxique correcte ni indentation correcte :-(

Sinon, ton "problème" n'a pas de sens pour moi. Par définition, si tu veux qu'après l'exécution de ta fonction,
main()
récupère quelque chose, il faudra bien que ta fonction s'arrête et repasse la main à
main()
.

Ton serveur peut s'arrêter, par exemple, parce que tu as récupéré tout ce que tu voulais, parce que le client te dit qu'il ne t'enverra plus rien, parce que c'est l'heure du goûter, etc. (c'est à toi de décider, hein ;-).

Tu peux aussi, bien sûr, lancer le serveur dans un thread et d'utiliser des mutex, pour exécuter en parallèle le serveur et traiter les données qu'il récupère (c'est un peu galère à mettre en place, si tu n'as jamais fait cela). Documente toi sur les threads Windows si tu veux faire cela.

Sinon, je ne comprends pas très bien ton application et tes explications ne sont pas limpides pour moi, ni pourquoi tu as besoin de gérer deux serveurs sur deux ports différents. Si tu as des capteurs qui envoient de l'information, le plus simple est qu'ils l'envoient sur le même port et que tu demandes à l'un d'envoyer ses données sur http://192.168.0.39:49668/capteur=1 et à l'autre de l'envoyer sur http://192.168.0.39:49668/capteur=2 (ou ce que tu veux) et ainsi le serveur pourra distinguer ce qui arrive de l'un et de l'autre en analysant le contenu de la requête http récupérée.
emmy_2019
Messages postés
53
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
29 mai 2019
> [Dal]
Messages postés
5131
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juin 2019
-
Pour ton commentaire :
Mes trois capteurs m'envoient sur le port 8008: les informations liées aux états de portes et sur le port 8080 les données de comptages passagers. Le capteur a deux services. en fait il peut pas envoyer toutes les données sur le même port car il n'est pas programmé pour en faire .
Le client peut me dire qu'il me n'envoie rien si toutes les portes (3capteurs installés dans les trois portes du bus ) sont fermées càd si le socket 1 de port 8008 m'envoie des recvbuf ( door1 closedoor, door2 closedoor, door3close).
j'espère que c'est bien claire pour toi maintenant et je suis désolée si j'étais pas bien claire au début.
Merci
emmy_2019
Messages postés
53
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
29 mai 2019
-
Dal J'ai posté une nouvelle question qui contient tout les détails du fonctionnement de mes trois capteurs : https://www.commentcamarche.net/forum/affich-36000852-remplir-les-donnees-recues-server-socket-tcp?jqS9AFAGU0hHTVQof2A1eC-_hjQ7h1bMi844kJzGNHw
Commenter la réponse de [Dal]