Envois de trame via socket udp
Fermé
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
-
28 août 2009 à 13:58
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 3 sept. 2009 à 14:59
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 3 sept. 2009 à 14:59
A voir également:
- Envois de trame via socket udp
- Udp vs tcp - Guide
- Trame de fond word - Guide
- Partager des photos via un lien - Guide
- Via michelin - Télécharger - Transports & Cartes
- Trame planning aide-soignante ssiad - Télécharger - Outils professionnels
30 réponses
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
1
3 sept. 2009 à 10:21
3 sept. 2009 à 10:21
et voici le prgramme serveur sur lequel j'ai plus de mal, et je crois que l'erreur est ici, quand je compile , je ne trouve pa sd'erreur, mais aprés quand je simule je ne reçois aucune donnée, je crois qu'il y'a une probleme dans les pointeur, voici le programme merci:
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio> // Pour les Sprintf
#pragma comment(lib,"ws2_32.lib")
// ********************************************************
// Définition des variables
// ********************************************************
WSADATA initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
int erreur; // Variable permettant de récupérer la valeur de retour des fonctions utilisées
int tempo; // Variable temporaire de type int
int nombre_de_caractere; // Indique le nombre de caractères qui a été reçu ou envoyé
SOCKET id_de_la_socket; // Identifiant de la socket
SOCKADDR_IN information_sur_la_destination; // Déclaration de la structure des informations lié au serveur
SOCKADDR_IN information_sur_la_source; // Déclaration de la structure des informations lié à l'écoute
char var[33333]; // Tampon contenant les données reçues ou envoyées
SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket
char* c;
struct buffer
{
char nature[3];
char donnee[100];
};
typedef struct buffer buffer;
int main(int argc, char* argv[])
{
printf("\nBonjour, vous etes du cote FRONTAL");
// ********************************************************
// Initialisation de Winsock
// ********************************************************
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");
// ********************************************************
// Ouverture d'une Socket
// ********************************************************
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");
// ********************************************************
// Lie la socket à une ip et un port d'écoute
// ********************************************************
information_sur_la_source.sin_family=AF_INET;
information_sur_la_source.sin_addr.s_addr=inet_addr("172.16.192.68"); // Ecoute sur l'adresse IP 172.16.192.68
information_sur_la_source.sin_port=htons(23); // Ecoute sur le port 23
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 : %d %d",erreur,WSAGetLastError());
else
printf("\nbind : OK");
// ********************************************************
// Reception des données
// ********************************************************
tempo=sizeof(information_sur_la_source); // Passe par une variable afin d'utiliser un pointeur
buffer var;
sprintf(var.nature,"");
sprintf(var.donnee,"");
nombre_de_caractere=recvfrom(id_de_la_socket,c,1515,0,(struct sockaddr*)&information_sur_la_source,&tempo);
c=(char*) (&var);
var.nature[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recvfrom ne le fait pas
printf("\nVoici les donnees : %s",var.nature);
var.donnee[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recvfrom ne le fait pas
printf("\nVoici les donnees : %s",var.nature);
// ********************************************************
// Fermeture des deux socket correspondant à la commande socket() et accept()
// ********************************************************
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");
// ********************************************************
// Quitte proprement le winsock ouvert avec la commande WSAStartup
// ********************************************************
erreur=WSACleanup(); // A appeler autant de fois qu'il a été ouvert.
if (erreur!=0)
printf("\nDesole, je ne peux pas liberer winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nWSACleanup : OK");
return 0;
}
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio> // Pour les Sprintf
#pragma comment(lib,"ws2_32.lib")
// ********************************************************
// Définition des variables
// ********************************************************
WSADATA initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
int erreur; // Variable permettant de récupérer la valeur de retour des fonctions utilisées
int tempo; // Variable temporaire de type int
int nombre_de_caractere; // Indique le nombre de caractères qui a été reçu ou envoyé
SOCKET id_de_la_socket; // Identifiant de la socket
SOCKADDR_IN information_sur_la_destination; // Déclaration de la structure des informations lié au serveur
SOCKADDR_IN information_sur_la_source; // Déclaration de la structure des informations lié à l'écoute
char var[33333]; // Tampon contenant les données reçues ou envoyées
SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket
char* c;
struct buffer
{
char nature[3];
char donnee[100];
};
typedef struct buffer buffer;
int main(int argc, char* argv[])
{
printf("\nBonjour, vous etes du cote FRONTAL");
// ********************************************************
// Initialisation de Winsock
// ********************************************************
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");
// ********************************************************
// Ouverture d'une Socket
// ********************************************************
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");
// ********************************************************
// Lie la socket à une ip et un port d'écoute
// ********************************************************
information_sur_la_source.sin_family=AF_INET;
information_sur_la_source.sin_addr.s_addr=inet_addr("172.16.192.68"); // Ecoute sur l'adresse IP 172.16.192.68
information_sur_la_source.sin_port=htons(23); // Ecoute sur le port 23
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 : %d %d",erreur,WSAGetLastError());
else
printf("\nbind : OK");
// ********************************************************
// Reception des données
// ********************************************************
tempo=sizeof(information_sur_la_source); // Passe par une variable afin d'utiliser un pointeur
buffer var;
sprintf(var.nature,"");
sprintf(var.donnee,"");
nombre_de_caractere=recvfrom(id_de_la_socket,c,1515,0,(struct sockaddr*)&information_sur_la_source,&tempo);
c=(char*) (&var);
var.nature[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recvfrom ne le fait pas
printf("\nVoici les donnees : %s",var.nature);
var.donnee[nombre_de_caractere]=0; // Permet de fermer le tableau après le contenu des data, car la fonction recvfrom ne le fait pas
printf("\nVoici les donnees : %s",var.nature);
// ********************************************************
// Fermeture des deux socket correspondant à la commande socket() et accept()
// ********************************************************
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");
// ********************************************************
// Quitte proprement le winsock ouvert avec la commande WSAStartup
// ********************************************************
erreur=WSACleanup(); // A appeler autant de fois qu'il a été ouvert.
if (erreur!=0)
printf("\nDesole, je ne peux pas liberer winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nWSACleanup : OK");
return 0;
}
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 sept. 2009 à 11:21
3 sept. 2009 à 11:21
nombre_de_caractere=recvfrom(id_de_la_socket,c,1515,0,(struct sockaddr*)&information_sur_la_source,&tempo); c=(char*) (&var);
ça c'est n'importe quoi. Tu ne t'en sortira jamais en C si tu ne comprends pas un minimum ce que tu fais !
nombre_de_caractere=recvfrom(id_de_la_socket,c,1515,0,(struct sockaddr*)&information_sur_la_source,&tempo); buffer *tmp,var; tmp=(buffer*)c; var=*tmp;// je ne suis pas certain que cette ligne fonctionne
Il faut qu'à la réception tu mettes c dans var, tu fait l'inverse, donc autant dire que tu oublie ce que tu viens de recevoir.
au sujet du "var=*tmp" : je ne me rappel plus si en C on peut mettre une structure dans une autre comme ça (comme c'est le cas en C++).
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
1
3 sept. 2009 à 11:44
3 sept. 2009 à 11:44
la c'est vramiment la misére sa ne marche pas, j'ai compris se que je dois faire, je doit récupérer c qui pointe sur la structure buffer aprés de lire se qu'il y'a dedans, mais aprés pour traduire tous sa en C j'avoue que je suis un peu perdu avec les pointeur la, et a chaque fois il me met, on ne peut pas convertir de char* vers char ou je ne sais pas quoi, je commence a en avoir marre la, c'est un truc de malade ce langage.
t'as pas une solution la? pour récupérer ces maudites données, parsque le truc que tu m'a envoyer ne marche pas.
désolé pour le dérangement, franchement t'es sympa.
merci
t'as pas une solution la? pour récupérer ces maudites données, parsque le truc que tu m'a envoyer ne marche pas.
désolé pour le dérangement, franchement t'es sympa.
merci
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 sept. 2009 à 12:58
3 sept. 2009 à 12:58
qu'est ce qui ne fonctionne pas ? Donne le message d'erreur exact.
L'envoie semble OK, il compile et tout.
La reception maintenant, si tu met ce que je viens de te dire : fait une première sortie pour savoir combien vaut nombre_de_caractere.
Il ne manque pas la commande accept() dans ton serveur ? (je connait peu UDP)
L'envoie semble OK, il compile et tout.
La reception maintenant, si tu met ce que je viens de te dire : fait une première sortie pour savoir combien vaut nombre_de_caractere.
Il ne manque pas la commande accept() dans ton serveur ? (je connait peu UDP)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
1
3 sept. 2009 à 13:06
3 sept. 2009 à 13:06
oui l'envois marche tres bien le bleme se trouve dans la reception, non il ne manque pas d'accept, on utilise cette fonction pour tcp. parsque j'ai réussis a envoyer une chaine de caractére via udp mais pour la structure, je ne sais pas se que je dois faire la.
et bin méme si j'utilise se que vous m'aviez envoyer, il me met des messages d'erreur.
et bin méme si j'utilise se que vous m'aviez envoyer, il me met des messages d'erreur.
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
1
3 sept. 2009 à 14:07
3 sept. 2009 à 14:07
re la sa compile bien j'ai pas d'erreur, mais dés que je lance le programme sa bug.
il s'arrete a la partie bind, aprés quand il arrive a la partie recvto sa bug, est-que-vous savez pourquoi? c'est la premiére fois que je vois sa
il s'arrete a la partie bind, aprés quand il arrive a la partie recvto sa bug, est-que-vous savez pourquoi? c'est la premiére fois que je vois sa
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 sept. 2009 à 14:10
3 sept. 2009 à 14:10
j'ai l'impression que tu n'as pas allouer de mémoire à "c".
soit tu fait un c=(char*)malloc(1313);
soit tu fait "char c[1313];" : tu défini un tableau à la place d'un pointeur.
soit tu fait un c=(char*)malloc(1313);
soit tu fait "char c[1313];" : tu défini un tableau à la place d'un pointeur.
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
1
3 sept. 2009 à 14:20
3 sept. 2009 à 14:20
quand je met l'instruction de malloc sa ne marche pas, il me met la meme erreur qu'avant, mais quand je déclare char c[3333]sa compile normal pas d'erreur, quand je lance le programme sereuve il ne bug pas, mais de que je lance le programme client, le programme serveur bug.
je crois que je dois les déclarer de la méme maniere parsque la dans le programme serveur j'ai declaré c comme char c[3333], et dans le programme client, je l'ai déclaré const char* c;
je crois que je dois les déclarer de la méme maniere parsque la dans le programme serveur j'ai declaré c comme char c[3333], et dans le programme client, je l'ai déclaré const char* c;
bellil.abdel
Messages postés
34
Date d'inscription
mercredi 8 avril 2009
Statut
Membre
Dernière intervention
3 septembre 2009
1
3 sept. 2009 à 14:40
3 sept. 2009 à 14:40
sa y'est sa marche la, je vous remercie infiniment monsieur, vous etiez vraiment patient avec moi, et vous etiez d'un grand aide je veux seulement vous demander un dernier petit service
est-ce-que vous pouvez me mettre des commentaires sur cette partie que vous m'aviez envoyer, pour que je comprenne mieux, merci:
buffer *tmp,var;
tmp=(buffer*)c;
var=*tmp;
au revoir et merci infiniment encore une fois, vous etes sympa
est-ce-que vous pouvez me mettre des commentaires sur cette partie que vous m'aviez envoyer, pour que je comprenne mieux, merci:
buffer *tmp,var;
tmp=(buffer*)c;
var=*tmp;
au revoir et merci infiniment encore une fois, vous etes sympa
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 sept. 2009 à 14:59
3 sept. 2009 à 14:59
déclaration d'un pointeur vers buffer pour récupérer le rsultat, et de la structure finale.
buffer *tmp,var;
on fait pointé le pointeur tmp vers le résultat, avec un cast dynamique.
tmp=(buffer*)c;
on affecte le résultat à une variable var par copie
var=*tmp;
Si j'utilise tmp, c'est qu'il est interdit de faire : &var=(buffer*)c; .
Si ton compilateur n'était pas aussi bornée, le plus simple serait de faire comme pour le sendto de passer &var à recvfrom. De même en écriture plus condenser on pourrai écrire :
var=*((buffer*)c);
Mais comme ton compilo est chiant, j'ai préférer être prudent.
buffer *tmp,var;
on fait pointé le pointeur tmp vers le résultat, avec un cast dynamique.
tmp=(buffer*)c;
on affecte le résultat à une variable var par copie
var=*tmp;
Si j'utilise tmp, c'est qu'il est interdit de faire : &var=(buffer*)c; .
Si ton compilateur n'était pas aussi bornée, le plus simple serait de faire comme pour le sendto de passer &var à recvfrom. De même en écriture plus condenser on pourrai écrire :
var=*((buffer*)c);
Mais comme ton compilo est chiant, j'ai préférer être prudent.