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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 */

+ 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