[C/Reseau] Comment savoir sur quel port tourne un socket ?

Comment savoir sur quel port tourne un socket ? [C/Reseau] - C++ - Programmation

Marsh Posté le 13-09-2002 à 20:49:08    

Je m'explique.
 
J'ai une petite appli client server a creer.
 
Le server doit gerer 20 client maximum.
 
Le client se connecte au serveur, et envoie un paquet avec ses informations a lui ( passage oblige, perso ca me semble completement inutile, mais le sujet est comme ca... alors).
 
J'ai declare un socket classique dans le client, que je binde en utilisant la valeur de port 0 afin d'en avoir un au hasard (et ainsi pouvoir lancer plusieurs clients sur ma becane).
 
Seulement, apres avoir lance le bind avec la valeur 0, les informations dans la struct sockaddr_in valent tjs 0... :/
 
Donc je ne peux pas savoir le port qui m;a ete attribue par le bind().
 
Vous auriez un moyen de le savoir ?
 
Il me faudrait finalement juste la fonction qui prends en parametre un socket et qui dit sur quel port il tourne :/
 
Merci d'avance :hello:
 
Petite illustration niveau code :
 

Code :
  1. // je cree mon socket
  2.   if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
  3.     perror("socket" );
  4.     exit(1);
  5.   }
  6.  
  7. // je prepare ma structure d'info sur moi, avec un port valant 0 pour en avoir un au hasard
  8.   my_addr.sin_family = AF_INET;         // host byte order
  9.   my_addr.sin_port = htons(0);     // short, network byte order
  10.   my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // automatically fill with my IP
  11.   memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
  12.  
  13. // Je binde, et je lui passe la structure d'avant
  14.   if (bind(sockfd, (struct sockaddr *)&my_addr,
  15.    sizeof(struct sockaddr)) == -1) {
  16.     perror("bind" );
  17.     exit(1);
  18.   }
  19. //Je controle le contenu de my_addr, en esperant qu;il y aie mis la valeur du port attribuee :
  20.   printf("Port recu : %d\n", my_addr.sin_port);
  21. //ca me renvoie 0


 
c'est qu'un extrait bien entendu...
 
Comment je peux obtenir les infos ? Merci d'avance, je suis bien dans le caca la :/


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 13-09-2002 à 20:49:08   

Reply

Marsh Posté le 13-09-2002 à 21:04:41    

>> Il me faudrait finalement juste la fonction qui prends en parametre un socket et qui dit sur quel port il tourne :/
 
getsockname(), qui te remplit une sockaddr_in. htons(son champ sinport) te donne le port.

Reply

Marsh Posté le 13-09-2002 à 21:05:51    

(pkoi tu specifie pas un port ?? sinon ca va etre la merde pour que tes clients se connectent, y vont pas savoir ou !)
 

Reply

Marsh Posté le 13-09-2002 à 21:06:45    

http://msdn.microsoft.com/library/ [...] name_2.asp
 
chrisbk > il parle du client


Message édité par mrbebert le 13-09-2002 à 21:10:28
Reply

Marsh Posté le 13-09-2002 à 21:08:37    

euh, tetede', tous les ports sont ouverts sur ton serveur alors? (ou j'ai loupé un épisode quand j'ai cru comprendre ce qu'était une socket?)

Reply

Marsh Posté le 13-09-2002 à 21:15:11    

--greg-- a écrit a écrit :

euh, tetede', tous les ports sont ouverts sur ton serveur alors? (ou j'ai loupé un épisode quand j'ai cru comprendre ce qu'était une socket?)




 
yep, mais comme on doit gerer plusieurs clients sur une machine, faut bien specifier plusieurs ports differents.
 
Sinon forcement ca chie :/
 
enfin je vais demander au prof mais bon... merci pour la fonction ;)
 


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 13-09-2002 à 21:17:38    

A moins que vous sachiez comment faire pour faire tourner plusieurs clients sur la meme machine sans binder avec un port au hasard :??:


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 13-09-2002 à 21:21:53    

--greg-- a écrit a écrit :

euh, tetede', tous les ports sont ouverts sur ton serveur alors? (ou j'ai loupé un épisode quand j'ai cru comprendre ce qu'était une socket?)




nop
Le client à besoin de savoir sur quel port du SERVEUR il doit se connecter
Mais le CLIENT utilise un port pour se connecter au serveur
et les 2 n'ont rien à voir.
1 du côté client, l'autre du coté serveur
Le serveur écoute sur un seul port en général...
 
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 13-09-2002 à 21:28:17    

[SDF]Poire a écrit a écrit :

 
nop
Le client à besoin de savoir sur quel port du SERVEUR il doit se connecter
Mais le CLIENT utilise un port pour se connecter au serveur
et les 2 n'ont rien à voir.
1 du côté client, l'autre du coté serveur
Le serveur écoute sur un seul port en général...
 
 :hello:  



ha, oui, tout juste, auguste.

Reply

Marsh Posté le 13-09-2002 à 21:28:36    

[SDF]Poire a écrit a écrit :

 
nop
Le client à besoin de savoir sur quel port du SERVEUR il doit se connecter
Mais le CLIENT utilise un port pour se connecter au serveur
et les 2 n'ont rien à voir.
1 du côté client, l'autre du coté serveur
Le serveur écoute sur un seul port en général...
 
 :hello:  




 
je me disais aussi... Merci :hello:


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 13-09-2002 à 21:28:36   

Reply

Marsh Posté le 13-09-2002 à 21:31:37    

2 rien G déjà eu faire prog rezo en projet donc...  :D  
Mais pas en C  :sarcastic:  
 
Bonne soirée
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 13-09-2002 à 21:31:57    

Tetedeiench a écrit a écrit :

A moins que vous sachiez comment faire pour faire tourner plusieurs clients sur la meme machine sans binder avec un port au hasard :??:



Dans tous les cas, les clients devront être sur des ports différents.
 
Juste une question en passant : les clients ils sont connectés sur quel port du serveur ? Ils sont sur celui qui reçoit la connexion ou pas ?
(tu as la fonction getpeername, avec le même prototype que getsockname, mais qui donne les infos sur l'autre côté de la connexion)
 
Edit : si c'est en UDP, oublie ma question, elle n'a plus lieu d'être.


Message édité par mrbebert le 13-09-2002 à 23:57:25
Reply

Marsh Posté le 13-09-2002 à 21:34:36    

mrbebert a écrit a écrit :

Dans tous les cas, les clients devront être sur des ports différents.
 




Pas forcément
je C que des clients peuvent partager un port C possible
mais comment je C po...
G pas envie de chercher ds la doc socket 2 là  :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 13-09-2002 à 21:46:21    

les clients qui font que se connecter au serveur ont pas besoin de bind

Reply

Marsh Posté le 13-09-2002 à 22:19:26    

[SDF]Poire a écrit a écrit :

 
Pas forcément
je C que des clients peuvent partager un port C possible
mais comment je C po...
G pas envie de chercher ds la doc socket 2 là  :D  



là, je vois pas comment c'est possible :heink:  
Côté serveur, OK. Je pense que les sockets créées au moment de la connexion peuvent utiliser le même port que celui qui accepte la connexion. Mais côté client.... :??:  

Reply

Marsh Posté le 13-09-2002 à 22:50:23    

Avec UDP ?
Le serveur recoit le datagramme d'un client, puis d'un autre, ... tjrs sur le meme port ... :??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 13-09-2002 à 23:36:03    

en fait, la je cree un client, et je dois binder pour lui assigner un port.
 
Je suis OBLIGE d'envoyer le port sur lequel le client tourne avec le premier paquet d'enregistrement :/
 
Donc de binder kkpart :/
 
Ensuite le serveur recoit le paquet, lance un thread sur un autre port qui va s'occuper dudit client... etc ;)
 
Vla comment j'opere :D


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 13-09-2002 à 23:42:53    

Tetedeiench a écrit a écrit :

Ensuite le serveur recoit le paquet, lance un thread sur un autre port qui va s'occuper dudit client... etc ;)


tu es en train de faire un serveur ftp ? c'est comme ça que ça marche (enfin, une des façons de marcher) :  le client se connecte sur le port standard (21 ?) et envoie ses commandes (login, pass, choppe tel fichier) avec cette socket. lorsqu'il doit recevoir un bloc de données (listing de répertoires, un fichier, etc.) le serveur lui assigne un port sur lequel se connecter.

Reply

Marsh Posté le 13-09-2002 à 23:48:57    

non non c'est juste un projet pour l'instant a la con...
 
La je dois envoyer une requete au serveur "envoie moi 15 paquets a 15 ms d'intervalle" et je dois les receptionner et regarder l'heure a laquelle ils ont ete crees etc.
 
Truc chiant quoi ;)


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 13-09-2002 à 23:51:29    

ok :D je précise pour le ftp car quand j'essayais de comprendre le protocole, mater des sources m'a bien aidé.

Reply

Marsh Posté le 13-09-2002 à 23:55:00    

Tetedeiench a écrit a écrit :

en fait, la je cree un client, et je dois binder pour lui assigner un port.
 
Je suis OBLIGE d'envoyer le port sur lequel le client tourne avec le premier paquet d'enregistrement :/
 
Donc de binder kkpart :/
 
Ensuite le serveur recoit le paquet, lance un thread sur un autre port qui va s'occuper dudit client... etc ;)
 
Vla comment j'opere :D



C'est en UDP, on est bien d'accord.
Essaie de faire le bind avec le port à 0, puis de demander à la socket son "name" avec la fonction getsockbyname. Théoriquement, elle devrait indiquer le port sur lequel elle s'est mis.
 
helloworld > Je pensais TCP, c'est pour ca que je parlais de plusieurs sockets :pt1cable:

Reply

Marsh Posté le 14-09-2002 à 00:21:45    

mrbebert a écrit a écrit :

C'est en UDP, on est bien d'accord.
Essaie de faire le bind avec le port à 0, puis de demander à la socket son "name" avec la fonction getsockbyname. Théoriquement, elle devrait indiquer le port sur lequel elle s'est mis.
 
helloworld > Je pensais TCP, c'est pour ca que je parlais de plusieurs sockets :pt1cable:  




 
oui oui ca marche parfaitement la :D
 
Merci :jap:
 
Je peux vous mettre les sources ici une fois que j;aurai termine mon clean de printf partoo ;)


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 14-09-2002 à 00:31:22    

Tiens je viens de voir qu'il faut que je gere mes threads dans une liste chainee...
 
Zou, au boulot.
 
Ca de moins a faire plus tard ;)


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed