Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1607 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°214052
Tetedeienc​h
Head Of God
Posté le 13-09-2002 à 20:49:08  profilanswer
 

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 !
mood
Publicité
Posté le 13-09-2002 à 20:49:08  profilanswer
 

n°214058
youdontcar​e
Posté le 13-09-2002 à 21:04:41  profilanswer
 

>> 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.

n°214059
chrisbk
-
Posté le 13-09-2002 à 21:05:51  profilanswer
 

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

n°214060
mrbebert
Posté le 13-09-2002 à 21:06:45  profilanswer
 

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


Message édité par mrbebert le 13-09-2002 à 21:10:28
n°214061
--greg--
Posté le 13-09-2002 à 21:08:37  profilanswer
 

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?)

n°214065
Tetedeienc​h
Head Of God
Posté le 13-09-2002 à 21:15:11  profilanswer
 

--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 !
n°214067
Tetedeienc​h
Head Of God
Posté le 13-09-2002 à 21:17:38  profilanswer
 

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 !
n°214069
[SDF]Poire
Vive Grumly
Posté le 13-09-2002 à 21:21:53  profilanswer
 

--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:
n°214074
--greg--
Posté le 13-09-2002 à 21:28:17  profilanswer
 

[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.

n°214075
Tetedeienc​h
Head Of God
Posté le 13-09-2002 à 21:28:36  profilanswer
 

[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 !
mood
Publicité
Posté le 13-09-2002 à 21:28:36  profilanswer
 

n°214079
[SDF]Poire
Vive Grumly
Posté le 13-09-2002 à 21:31:37  profilanswer
 

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:
n°214080
mrbebert
Posté le 13-09-2002 à 21:31:57  profilanswer
 

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
n°214083
[SDF]Poire
Vive Grumly
Posté le 13-09-2002 à 21:34:36  profilanswer
 

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:
n°214090
chrisbk
-
Posté le 13-09-2002 à 21:46:21  profilanswer
 

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

n°214099
mrbebert
Posté le 13-09-2002 à 22:19:26  profilanswer
 

[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.... :??:  

n°214112
HelloWorld
Salut tout le monde!
Posté le 13-09-2002 à 22:50:23  profilanswer
 

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
n°214130
Tetedeienc​h
Head Of God
Posté le 13-09-2002 à 23:36:03  profilanswer
 

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 !
n°214136
youdontcar​e
Posté le 13-09-2002 à 23:42:53  profilanswer
 

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.

n°214140
Tetedeienc​h
Head Of God
Posté le 13-09-2002 à 23:48:57  profilanswer
 

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 !
n°214142
youdontcar​e
Posté le 13-09-2002 à 23:51:29  profilanswer
 

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

n°214145
mrbebert
Posté le 13-09-2002 à 23:55:00  profilanswer
 

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:

n°214161
Tetedeienc​h
Head Of God
Posté le 14-09-2002 à 00:21:45  profilanswer
 

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 !
n°214164
Tetedeienc​h
Head Of God
Posté le 14-09-2002 à 00:31:22  profilanswer
 

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 !
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Access en réseauinterface graphique, gestion souris,gestion imprimante reseau
Delphi : Savoir si une clé existe dans la base de registre ?Excel et port com1 (vba de excel donc)
[C/Reseau] Petite explication niveau sockets please...[php] probleme de port??
[visual basic]comment activer le port joystick[socket] UDP ou TCP ?
Port infrarouge et téléphone nokiaPb avec fonction readLine() de la classe Socket PEAR
Plus de sujets relatifs à : [C/Reseau] Comment savoir sur quel port tourne un socket ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR