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

Réseau C Discussion :

Problème de socket en UDP


Sujet :

Réseau C

  1. #1
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut Problème de socket en UDP
    Bonsoir

    j'ai un probleme qd je crée une socket udp en souhaitant lui associer un numéro de port quelconque (automatiquement)

    je la crée comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	struct hostent*infosHost;
    	struct in_addr adresseIP;
    	struct sockaddr_in adresseSocketClient;
    	unsigned int tailleSockaddr_in;
     
     
    	if((hSocket = socket(AF_INET,SOCK_DGRAM,0))==-1)
    	{
    		printf("Erreur: %d",errno);
    		exit(1);
    	}
    	else
    	printf("creation de la socket reussie \n",hSocket);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	tailleSockaddr_in = sizeof(struct sockaddr_in);
    	memset(&adresseSocketClient,0,tailleSockaddr_in);//init
    	adresseSocketClient.sin_family = AF_INET;
    	memcpy(&adresseSocketClient.sin_addr,infosHost->h_addr,infosHost->h_length);
    mon probleme est que le numéro de port qui lui est associé est tjrs null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	printf("IP host:%s \n",inet_ntoa(adresseIP));
    	printf("num port %d \n",ntohs(adresseSocketClient.sin_port));
    et je ne comprend pas pk?

  2. #2
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Bonsoir,

    Tout d'abord la syntaxe de ta dernière ligne ne serait pas plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("num port %d \n",htons(adresseSocketClient.sin_port));
    Et puis nul part dans ton code que tu fournit tu donne une valeur à "adresseSocketClient.sin_port".

  3. #3
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par snake264 Voir le message
    Bonsoir,

    Tout d'abord la syntaxe de ta dernière ligne ne serait pas plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("num port %d \n",htons(adresseSocketClient.sin_port));
    Et puis nul part dans ton code que tu fournit tu donne une valeur à "adresseSocketClient.sin_port".
    bonjour je viens de voir ta réponse pour la syntaxe elle est bonne car La fonction htons() convertit un entier court (short) hostshort depuis l'ordre des octets de l'hôte vers celui du réseau et moi je fais l'inverse donc j'utilise ntohs.

    et pour sin_port je donne pas de valeur car je veux laisser l'OS donner un numéro de port quelconque.

    est ce que qlqn voit ou est le problème.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par alexorcet Voir le message
    et pour sin_port je donne pas de valeur car je veux laisser l'OS donner un numéro de port quelconque.
    Tu n'as pas à te préoccuper du port local. Il sera choisis et positionné par le gestionnaire de sockets au moment de l'envoi du message (sendto()). Par contre il est impératif de donner une valeur valide (et correctement codée : htons()) au port distant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adresseSocketClient.sin_port = htons (PORT);

  5. #5
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Tu n'as pas à te préoccuper du port local. Il sera choisis et positionné par le gestionnaire de sockets au moment de l'envoi du message (sendto()). Par contre il est impératif de donner une valeur valide (et correctement codée : htons()) au port distant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adresseSocketClient.sin_port = htons (PORT);
    Merci pr ta réponse, en fait j'execute le code (.c) deux fois donc deux client ont le meme code et pour qu'un client envoie à un autre il doit connaitre l'IP et le numero de port que j'essaie d'afficher avant et surlequel le client cible attend de recevoir des message.
    voici mon code:
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    int main()
    {
     
    	int hSocket,ret;
    	FILE *P_FICHIER;
    	FILE *P_FICH;
    	char* nf = "MessagesClient.txt";	
    	char buf[BUFSIZ],IP[BUFSIZ];
     
    	struct hostent *infosOther,*infosHost;
    	struct in_addr adresseIPP,adresseIP;
    	struct sockaddr_in adresseSocketClient,adresseSocketClientCible;
    	unsigned int tailleSockaddr_in;
    	char  msgClient[MAXSTRING];
    	int POR;	
    	int rep = 0;
     
     
    //Création de la socket
     
    	if((hSocket = socket(AF_INET,SOCK_DGRAM,0))==-1)
    	{
    		printf("Erreur: %d",errno);
    		exit(1);
    	}
    	else
    	printf("creation de la socket reussie \n",hSocket);
     
     
    //création du thread de reception de message
     
    	ret = pthread_create(&threadHandle,NULL,fctThread,(void*)hSocket);
    	puts("thread lance");
    	ret = pthread_detach(threadHandle);		
    	//getchar();
     
    do
    {	rep = menu();
    	switch(rep)
     
    	{
     
    		case 1: 
     
    	if((infosHost = gethostbyname("localhost"))==0)
    	{
    		printf("errreur aquisition infos du host");
    	}
    	else 
    	printf("aquisition infos du host OK :-))\n");
    	memcpy(&adresseIP,infosHost->h_addr,infosHost->h_length);
     
     
     
    //préparation de sockaddr_in 
     
    	tailleSockaddr_in = sizeof(struct sockaddr_in);
    	memset(&adresseSocketClient,0,tailleSockaddr_in);//init
    	adresseSocketClient.sin_family = AF_INET;
    	memcpy(&adresseSocketClient.sin_addr,infosHost->h_addr,infosHost->h_length);
     
    	/*if(bind(hSocket,(struct sockaddr*)&adresseSocketClient,sizeof(struct sockaddr_in))==-1)
    	{
    		printf("Erreur au niveau du bind de la socket Client %d\n",errno);
    		exit(1);
    	}
    	else
    	printf("Bind reussi\n");
    	*/
     
    	printf("IP host:%s \n",inet_ntoa(adresseIP));
    	printf("num port %d \n",ntohs(adresseSocketClient.sin_port));
     
    	printf("inserer l'ip du destinataire:");
    	scanf("%s",IP);
    	printf("inserer son numero de port:");
    	scanf("%d",&POR);
     
     
    // acquisition des infos du client cible; 
     
    	if((infosOther = gethostbyname(IP))==0)
    	{
    		printf("errreur aquisition infos du client cible");
    	}
    	else 
    	printf("aquisition infos du client cible OK :-))\n");
    	memcpy(&adresseIPP,infosOther->h_addr,infosOther->h_length);
     
    //préparation de sockaddr_in 
     
    	tailleSockaddr_in = sizeof(struct sockaddr_in);
    	memset(&adresseSocketClientCible,0,tailleSockaddr_in);//init
    	adresseSocketClientCible.sin_family = AF_INET;
    	adresseSocketClientCible.sin_port = htons(POR);
    	memcpy(&adresseSocketClientCible.sin_addr,infosOther->h_addr,infosOther->h_length);
     
    	printf("IP client cible :%s \n",inet_ntoa(adresseIPP));
     
     
     
    //send vers le client cible
     
    	fflush(stdin);
    	printf("Message a envoyer:\n");
    	gets(msgClient);
    	if(sendto(hSocket,msgClient,MAXSTRING,0,&adresseSocketClientCible,tailleSockaddr_in)==-1)
    	{
    		printf("Erreur sur le send\n");
    		exit(1);
    	}else printf("send OK \n");
    		break;
    peut étre que c'est moi qui m'y prend mal mais bon à vous de m'aider plsss
    Merci d'avance.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fflush(stdin); /* comportement indéterminé */
    printf("Message a envoyer:\n"); /* puts()? */
    gets(msgClient); /* fonction obsolète, à proscrire */

  7. #7
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fflush(stdin); /* comportement indéterminé */
    printf("Message a envoyer:\n"); /* puts()? */
    gets(msgClient); /* fonction obsolète, à proscrire */

    et pour l'histoire des ports mon ami?
    lol

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par alexorcet Voir le message
    et pour l'histoire des ports mon ami?
    T'ain, t'es lourd... On se tue à t'expliquer que ça n'a aucune importance. Ca ne sert qu'au protocole. Le gestionnaire de socket génère un numéro différent et unique (enfin dans la limite du raisonnable, il n'y a que 16 bits, mais avant de faire le tour, il y a de quoi voir venir...) pour chaque paquet émis, même si il y a plusieurs clients sur la même machine (même IP).

    Au niveau applicatif, ce qui différencie les clients, c'est le numéro de socket.

  9. #9
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    hey manu calmos c mon premier programme UDP et je saisis pas trop bien encore les notions.
    et comment ça se fait que quand je lance 2 fois mon programme le deuxième client ne reçois rien.

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par alexorcet Voir le message
    hey manu calmos c mon premier programme UDP et je saisis pas trop bien encore les notions.
    et comment ça se fait que quand je lance 2 fois mon programme le deuxième client ne reçois rien.
    Euh il est où le serveur ? Parce que si tu cherches à faire client/client, ça ne fonctionne pas évidemment... C'est client/serveur, uniquement.

    http://emmanuel-delahaye.developpez.com/reseaux.htm

  11. #11
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Euh il est où le serveur ? Parce que si tu cherches à faire client/client, ça ne fonctionne pas évidemment... C'est client/serveur, uniquement.

    http://emmanuel-delahaye.developpez.com/reseaux.htm
    oui c ça j'essaye de faire client/client suivant les demandes du prof.
    car j'ai essayé client/serveur et ça marchait bien.
    soit à mon avis j'ai mal compris l'ennoncé soit c le prof qui demande un truc impossible.

    merci pr ton aide manu.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par alexorcet Voir le message
    oui c ça j'essaye de faire client/client suivant les demandes du prof.
    car j'ai essayé client/serveur et ça marchait bien.
    soit à mon avis j'ai mal compris l'ennoncé soit c le prof qui demande un truc impossible.
    Poste l'énoncé exact. On peut faire client/client, mais via un serveur relais. C'est obligatoire. L'architecture socket est exclusivement client/serveur.

  13. #13
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Poste l'énoncé exact. On peut faire client/client, mais via un serveur relais. C'est obligatoire. L'architecture socket est exclusivement client/serveur.
    l'ennoncé est le suivant:
    Il s'agit simplement de permettre à des applications en C/C++ de s'envoyer des messages textes (limités à une simple phrase) en précisant à chaque fois l'adresse et le port de l'unique destinataire.
    il s'agit d'échanges de messages basés sur UDP. Bien sûr, une application d'un type peut envoyer un message à une application de même type qu'elle.
    On demande l'introduction successive de l'adresse IP du destinataire, du port et finalement du message qui est ensuite envoyé
    tu crois qu'il faut deux ".c" un pour le client et un pour le serveur ou bien client/client avec un serveur relais comme tu disais.

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par alexorcet Voir le message
    l'ennoncé est le suivant:
    Déjà, un prof qui parle de C/C++, ça fout la trouille. Il y a C et il y a C++. Ce sont des langages différents. Point.
    tu crois qu'il faut deux ".c" un pour le client et un pour le serveur ou bien client/client avec un serveur relais comme tu disais.
    La logique voudrait que tu fasses un serveur multi-client capable d'établir une connexion entre 2 clients. C'est pas trivial, ça veut dire threads (ou select()) etc.

    Ca nécessite un peu d'étude préalable...

    Tu fais quoi comme études ?

    Sinon, il s'agit d'une liaison point à point client/serveur. C'est pas trop fait pour ça, mais c'est possible. Il faut un serveur et un client, et que le serveur soit lancé avant le client.

    J'ai entendu aussi parlé de liaison serveur/serveur, mais je ne sais pas si c'est vraiment possible... Jamais expérimenté...

  15. #15
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Déjà, un prof qui parle de C/C++, ça fout la trouille. Il y a C et il y a C++. Ce sont des langages différents. Point.

    La logique voudrait que tu fasses un serveur multi-client capable d'établir une connexion entre 2 clients. C'est pas trivial, ça veut dire threads (ou select()) etc.

    Ca nécessite un peu d'étude préalable...

    Tu fais quoi comme études ?

    Sinon, il s'agit d'une liaison point à point client/serveur. C'est pas trop fait pour ça, mais c'est possible. Il faut un serveur et un client, et que le serveur soit lancé avant le client.

    J'ai entendu aussi parlé de liaison serveur/serveur, mais je ne sais pas si c'est vraiment possible... Jamais expérimenté...
    merci d'avoir pris le temps de répondre.
    je fais des études de bachelier en informatique.
    il faudra que je demande des explications au prof alors vu les possibilités que tu m'a proposées.
    merci encore et bonne soirée je te tiendrai au courant des nouvelles.

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par alexorcet Voir le message
    merci d'avoir pris le temps de répondre.
    je fais des études de bachelier en informatique.
    Ouh là, ça existe ça ? Tu n'es pas en France ?

    Tu es probablement en Belgique et l'équivalent est la Licence en France (BAC+3)

    il faudra que je demande des explications au prof alors vu les possibilités que tu m'a proposées.
    Oui, tu as tout à fait raison.

  17. #17
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ouh là, ça existe ça ? Tu n'es pas en France ?

    Tu es probablement en Belgique et l'équivalent est la Licence en France (BAC+3)
    Exacte bien vu je suis un bielge une fois

  18. #18
    Membre confirmé Avatar de alexorcet
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Par défaut
    effectivement il fallait une architecture client serveur et moi je me compliquait trop la vie.
    a bientot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Socket en UDP - Multicast - Chat - Problème.
    Par ExSter dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 02/09/2010, 12h48
  2. Problème avec socket UDP
    Par Prayeriz dans le forum Développement
    Réponses: 4
    Dernier message: 12/01/2009, 08h18
  3. [Debutant] Problème Socket Linux UDP
    Par AxldenieD dans le forum Réseau
    Réponses: 3
    Dernier message: 01/11/2005, 17h08
  4. [Kylix] Problème de socket
    Par RaygKross dans le forum EDI
    Réponses: 1
    Dernier message: 01/03/2004, 19h41
  5. Mysql ne se lance pas problème de socket
    Par Riko dans le forum Installation
    Réponses: 5
    Dernier message: 05/02/2004, 09h28

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