Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

route add/delete : délai de prise en compte d'un changement

14 réponses
Avatar
Olivier Guillion
Bonjour,

J'envisage de programmer, sur Windows, un proxy qui distribue le
trafic entre 2 connexions ADSL simultanées.

Une solution serait de modifier la route (par route add ou change)
avant d'établir la connexion, de manière à la faire passer par l'une
ou l'autre interface.

Mais voila : la prise en compte du changement de la table de routage
est-il instantané, ou y aurait-t-il un cache quelque part ? Avant de
me lancer, j'aimerais savoir si la solution est techniquement viable.

(A propos, si quelqu'un a une idée d'un autre moyen d'établir la
connexion sur une interface donnée, qu'il n'hésite pas à me le dire).

Merci d'avance,

----
Olivier Guillion

10 réponses

1 2
Avatar
Tensibai
"Olivier Guillion" wrote in message
news:
Bonjour,

J'envisage de programmer, sur Windows, un proxy qui distribue le
trafic entre 2 connexions ADSL simultanées.

Une solution serait de modifier la route (par route add ou change)
avant d'établir la connexion, de manière à la faire passer par l'une
ou l'autre interface.

Tu ne peux pas créer de route avant que la connexion soit établie


Mais voila : la prise en compte du changement de la table de routage
est-il instantané, ou y aurait-t-il un cache quelque part ? Avant de
me lancer, j'aimerais savoir si la solution est techniquement viable.

"Normalement" la table est relue à chaque paquet


(A propos, si quelqu'un a une idée d'un autre moyen d'établir la
connexion sur une interface donnée, qu'il n'hésite pas à me le dire).

Faisable avec le protocole BAP (Bandwith Allocation Protocol) déja présent

dans le service routage et accès distant de Windows. Ou un système de
Network Load Balancing

Tu peux également lier ls interfaces (Sous Windows XP et 2003)

La meilleure solution à mon idée reste "d'agréger" les deux connections
(faire en sorte que les deux soient considérées comme une seule pour les
programmes) et ainsi de laisser le système faire le "gros" du travail

Avatar
Olivier Guillion
Le Wed, 14 Jan 2004 12:21:21 +0100, "Tensibai"

J'envisage de programmer, sur Windows, un proxy qui distribue le
trafic entre 2 connexions ADSL simultanées.

Une solution serait de modifier la route (par route add ou change)
avant d'établir la connexion, de manière à la faire passer par l'une
ou l'autre interface.

Tu ne peux pas créer de route avant que la connexion soit établie



Bien sûr que si, pour le trafic entrant HTTP.
Le client HTTP envoie la requète à un proxy tunnel, et le proxy
établit la route juste avant d'ouvrir la connexion proprement dite.

Mais voila : la prise en compte du changement de la table de routage
est-il instantané, ou y aurait-t-il un cache quelque part ? Avant de
me lancer, j'aimerais savoir si la solution est techniquement viable.

"Normalement" la table est relue à chaque paquet



Impeccable ! Merci !

A chaque paquet, ou à chaque connexion ?
J'ai fait un essai : je démarre un téléchargement HTTP avec le modem
#1, puis je détruis la route. Le chargement continue sur le modem #1
jusqu'à la fin. Par contre une fois la route détruite, si je démarre
un autre téléchargement, il passe par le modem # 2.

La destruction de la route aurait-elle dû me faire basculer
immédiatement les paquets par l'autre interface (et donc tout planter
car le serveur distant aurait vu l'adresse IP d'origine changer) ?

(A propos, si quelqu'un a une idée d'un autre moyen d'établir la
connexion sur une interface donnée, qu'il n'hésite pas à me le dire).

Faisable avec le protocole BAP (Bandwith Allocation Protocol) déja présent

dans le service routage et accès distant de Windows.


Je vais regarder ça. Merci !

Ou un système de
Network Load Balancing


ça j'ai pas, sinon, je me serais posé moins de question :)

Tu peux également lier ls interfaces (Sous Windows XP et 2003)

La meilleure solution à mon idée reste "d'agréger" les deux connections
(faire en sorte que les deux soient considérées comme une seule pour les
programmes) et ainsi de laisser le système faire le "gros" du travail


Je ne suis pas sûr que ce soit possible. Les 2 interfaces n'ont pas la
même IP, et ne sont même pas du même FAI :)


Avatar
Tensibai
Tu ne peux pas créer de route avant que la connexion soit établie


Bien sûr que si, pour le trafic entrant HTTP.
Le client HTTP envoie la requète à un proxy tunnel, et le proxy
établit la route juste avant d'ouvrir la connexion proprement dite.

là je dois avouer que je ne suis pas, qu'il bind le socket ok, mais la route

n'est pas gérée par le programme à ma connaissance

Mais voila : la prise en compte du changement de la table de routage
est-il instantané, ou y aurait-t-il un cache quelque part ? Avant de
me lancer, j'aimerais savoir si la solution est techniquement viable.

"Normalement" la table est relue à chaque paquet



Impeccable ! Merci !

A chaque paquet, ou à chaque connexion ?
Dsl je code un prog en udp et je suis résté sur l'udp où la table est lue à

chaque paquet, en tcp c'est à l'établissement de la connexion (une fois la
connexion faite elle est liée à l'interface :o))

J'ai fait un essai : je démarre un téléchargement HTTP avec le modem
#1, puis je détruis la route. Le chargement continue sur le modem #1
jusqu'à la fin. Par contre une fois la route détruite, si je démarre
un autre téléchargement, il passe par le modem # 2.

La destruction de la route aurait-elle dû me faire basculer
immédiatement les paquets par l'autre interface (et donc tout planter
car le serveur distant aurait vu l'adresse IP d'origine changer) ?

Donc non, voir ci dessus


(A propos, si quelqu'un a une idée d'un autre moyen d'établir la
connexion sur une interface donnée, qu'il n'hésite pas à me le dire).

Faisable avec le protocole BAP (Bandwith Allocation Protocol) déja

présent


dans le service routage et accès distant de Windows.


Je vais regarder ça. Merci !

Ou un système de
Network Load Balancing


ça j'ai pas, sinon, je me serais posé moins de question :)

Tu peux également lier ls interfaces (Sous Windows XP et 2003)

La meilleure solution à mon idée reste "d'agréger" les deux connections
(faire en sorte que les deux soient considérées comme une seule pour les
programmes) et ainsi de laisser le système faire le "gros" du travail


Je ne suis pas sûr que ce soit possible. Les 2 interfaces n'ont pas la
même IP, et ne sont même pas du même FAI :)

ça ne change rien, ton réseau local envoie sur l'interface locale, et après

en liant/agrégeant les connexions sortantes le système utilisera la première
connexion sortante disponible :) (ça reste à coder pour des système de type
9x, NT et peut être 2000, XP et 2003 permettant de le faire en natif via
API)



Avatar
Olivier Guillion
On Thu, 15 Jan 2004 19:16:37 +0100, "Tensibai"
wrote:

Le client HTTP envoie la requète à un proxy tunnel, et le proxy
établit la route juste avant d'ouvrir la connexion proprement dite.

là je dois avouer que je ne suis pas, qu'il bind le socket ok, mais la route

n'est pas gérée par le programme à ma connaissance


Voila comment ça marcherait :
1- Un PC de mon réseau local veut accéder à un fichier en HTTP
2- Il se connecte à mon petit proxy HTTP, en lui envoyant l'adresse où
il désire récupérer le fichier (CONNECT xxxx)
3- Mon proxy décide du modem sur lequel effectuer la requete, en se
basant sur les connexions déjà en cours et leur débit (ainsi que le
débit maxi de chaque connexion ADSL)
4- Il construit une route sur xxxx passant par l'interface désirée
5- Il se connecte au serveur distant par cette route
6- Il relaye les données reçues vers le PC demandeur
7- Lorsque la connexion est fermée, il détruit la route.

ou, encore mieux si le changement de route n'affecte pas les
connexions déjà établies, il détruit la route juste après le point 5.

"Normalement" la table est relue à chaque paquet
Impeccable ! Merci !

A chaque paquet, ou à chaque connexion ?
Dsl je code un prog en udp et je suis résté sur l'udp où la table est lue à

chaque paquet, en tcp c'est à l'établissement de la connexion (une fois la
connexion faite elle est liée à l'interface :o))


Je vais tester tout ça. Merci ! :-)

Je ne suis pas sûr que ce soit possible. Les 2 interfaces n'ont pas la
même IP, et ne sont même pas du même FAI :)
ça ne change rien, ton réseau local envoie sur l'interface locale, et après

en liant/agrégeant les connexions sortantes le système utilisera la première
connexion sortante disponible :) (ça reste à coder pour des système de type
9x, NT et peut être 2000, XP et 2003 permettant de le faire en natif via
API)


J'ai pas trouvé les API en question. Et je ne vois pas trop comment ça
peut marcher, notamment par exemple pour un accès FTP où des
connexions multiples sont établies. Je ne suis pas sûr que le serveur
FTP distant apprécie qu'on essaie d'ouvrir un port pour les datas à
partir d'une IP qui n'est pas celle qui s'est authentifiée...

En plus, le choix de la "première connexion sortante disponible" me
paraît embêtant, les 2 connexions étant toujours disponibles, et le
choix devant être effectué selon le débit maximal de chacune et la
charge actuelle.

Dans ce que j'ai pu voir, c'était plutôt pour gérer le changement
d'interface lorsqu'une connexion tombe, mais j'ai peut-être mal
compris. Tout lien à ce sujet serait bienvenu...

Merci,

----
Olivier Guillion



Avatar
Tensibai
Le client HTTP envoie la requète à un proxy tunnel, et le proxy
établit la route juste avant d'ouvrir la connexion proprement dite.

là je dois avouer que je ne suis pas, qu'il bind le socket ok, mais la

route


n'est pas gérée par le programme à ma connaissance


Voila comment ça marcherait :
1- Un PC de mon réseau local veut accéder à un fichier en HTTP
2- Il se connecte à mon petit proxy HTTP, en lui envoyant l'adresse où
il désire récupérer le fichier (CONNECT xxxx)
3- Mon proxy décide du modem sur lequel effectuer la requete, en se
basant sur les connexions déjà en cours et leur débit (ainsi que le
débit maxi de chaque connexion ADSL)
Donc ta table de routage est déja existante.


4- Il construit une route sur xxxx passant par l'interface désirée
C'est un socket que tu crées sur l'interface, pas une route... (problème de

vocabulaire du coup :o))

5- Il se connecte au serveur distant par cette route
Connexion :)


6- Il relaye les données reçues vers le PC demandeur
7- Lorsque la connexion est fermée, il détruit la route.
Il ferme le socket (connexion)


J'ai pas trouvé les API en question. Et je ne vois pas trop comment ça
peut marcher, notamment par exemple pour un accès FTP où des
connexions multiples sont établies. Je ne suis pas sûr que le serveur
FTP distant apprécie qu'on essaie d'ouvrir un port pour les datas à
partir d'une IP qui n'est pas celle qui s'est authentifiée...
Dans le cas du ftp la connexion sur le port 20 doit ête effectuée avec la

m^m ip effectivement


En plus, le choix de la "première connexion sortante disponible" me
paraît embêtant, les 2 connexions étant toujours disponibles, et le
Il est rare que les Deux connexions soient inactivent en m^m temps pour un

proxy, et si c'est le cas il faut les trier par ordres de vitesse. Sinon
j'entendais par première disponible, celle qui n'envoie rien la première
(tjs avec préférene sur la + rapide) (à faire ...)



Avatar
Olivier Guillion
On Fri, 16 Jan 2004 14:26:56 +0100, "Tensibai"
wrote:

3- Mon proxy décide du modem sur lequel effectuer la requete, en se
basant sur les connexions déjà en cours et leur débit (ainsi que le
débit maxi de chaque connexion ADSL)
Donc ta table de routage est déja existante.



Je crois qu'on se comprend mal. Mon but est de permettre un partage du
trafic entrant (pas sortant). Je ne gère pas un serveur Web, mais un
petit parc de PC qui accèdent à l'Internet.
Oui, une table de routage existe, sur le PC qui sert de passerelle
vers Internet, avec deux routes par défaut (toutes les deux 0.0.0.0
mask 0.0.0.0). Le but du jeu est de faire choisir alternativement
l'une ou l'autre de ses routes en réponse aux demandes des PCs du
réseau local.

4- Il construit une route sur xxxx passant par l'interface désirée
C'est un socket que tu crées sur l'interface, pas une route... (problème de

vocabulaire du coup :o))


Je ne crois pas me tromper de vocabulaire. Exemple : Un PC demande de
récupérer un fichier sur le serveur Web à l'adresse IP 62.4.226.23.
Mon proxy fait l'équivalent de :
route add 62.4.226.23 mask 255.255.255.255 <passerelle> metric 1 if
<interface choisie>

5- Il se connecte au serveur distant par cette route
Connexion :)



Oui, là il ouvre une socket sur 62.4.226.23, qui passe donc par la
route qu'il vient de créér.

6- Il relaye les données reçues vers le PC demandeur
7- Lorsque la connexion est fermée, il détruit la route.
Il ferme le socket (connexion)

... Et il détruit la route :

route delete 62.4.226.23 mask 255.255.255.255 <passerelle>

Par ce procédé, le proxy peut décider par quelle interface passent
chacune des connexions demandées par les PC du réseau local, et donc
partager le trafic sur les 2 modems.

----
Olivier Guillion


Avatar
Tensibai
"Olivier Guillion" wrote in message
news:
On Fri, 16 Jan 2004 14:26:56 +0100, "Tensibai"
wrote:

3- Mon proxy décide du modem sur lequel effectuer la requete, en se
basant sur les connexions déjà en cours et leur débit (ainsi que le
débit maxi de chaque connexion ADSL)
Donc ta table de routage est déja existante.



Je crois qu'on se comprend mal. Mon but est de permettre un partage du
trafic entrant (pas sortant). Je ne gère pas un serveur Web, mais un
petit parc de PC qui accèdent à l'Internet.
Oui, une table de routage existe, sur le PC qui sert de passerelle
vers Internet, avec deux routes par défaut (toutes les deux 0.0.0.0
mask 0.0.0.0). Le but du jeu est de faire choisir alternativement
l'une ou l'autre de ses routes en réponse aux demandes des PCs du
réseau local.
Windows ne fonctionne pas avec Deux passerelle par défaut (comme tous les

sytème de routage)
Cette adresse est justement là pour donner une route aux paquets ne
correspondant à aucune entrée dans la table de routage
C'est en général la première qui est utilisée
Il est tout de même possible de géré un changement de passerelle en testant
la connectivité avec la passerelle principale ou en utilisant une trap snmp
(pas facile à mettre en oeuvre pour l'écriture d'un proxy) mais cela sort du
cadre du routage réseau


4- Il construit une route sur xxxx passant par l'interface désirée
C'est un socket que tu crées sur l'interface, pas une route... (problème

de


vocabulaire du coup :o))


Je ne crois pas me tromper de vocabulaire. Exemple : Un PC demande de
récupérer un fichier sur le serveur Web à l'adresse IP 62.4.226.23.
Mon proxy fait l'équivalent de :
route add 62.4.226.23 mask 255.255.255.255 <passerelle> metric 1 if
<interface choisie>

5- Il se connecte au serveur distant par cette route
Connexion :)



Oui, là il ouvre une socket sur 62.4.226.23, qui passe donc par la
route qu'il vient de créér.

Heu on bind un sock sur une adresse locale et on le connecte à une adresse

distante ou on lemet en écoute....
Je doit avouer que je ne vois pas exactement l'intéret de créer une route, à
partir du moment où tu as bind ton sock sur une adresse (interface) les
paquets de ce sock seront envoyé par cette interface.
La table de routage ne sera utilisé que si ton programme ne bind pas sur
une adresse spécifique (0.0.0.0 dans la structure sock_inaddr en C) et dans
ce cas le système (du moins la partie réseau) qui se chargera de choisir
l'interface sur laquelle envoyer les paquets en fonction de la tabe de
routage et du coût (METRIC) des routes.
Le bind n'étant pas nécessaire pour un sock client, si tu ne le fais pas
explicitement c'est l'OS qui choisi sur quelle interface le créer.


6- Il relaye les données reçues vers le PC demandeur
7- Lorsque la connexion est fermée, il détruit la route.
Il ferme le socket (connexion)

... Et il détruit la route :

route delete 62.4.226.23 mask 255.255.255.255 <passerelle>

Par ce procédé, le proxy peut décider par quelle interface passent
chacune des connexions demandées par les PC du réseau local, et donc
partager le trafic sur les 2 modems.

Suite à la reflecion précédente, il me paraît finalement plus simple de

jouer avec une table interne au programme pour décider de quelle interface
utiliser, de lier (bind) les sockets (connexion ?, la traduction laisse à
désirer désolé) à l'interface choisie, ce qui permet de contourner le
routage et simplifie (je pense) la dévellopement de la chose :).

Au fnal tu risque tout de même de réinventer le Network Load Balancing en
fait, tu peux peut être jeter un oiel sur pound
(www.apsis.ch/pound/index_html) qui fait proxy inverse (répartition des
demandes sur plusieurs serveurs web internes)

Essaie peut être aussi (si ce n'est déja fait) de jeter un oeil aux
implémentations de NBL sous linux.

Voila, cette fois je suis à court d'idée je pense :))

Tiens moi au courant, ton projet à l'air bien sympathique (si tu veux un
coup de patte sur des fonctions simples je suis disponible :))

----
Olivier Guillion




Avatar
Olivier Guillion
On Mon, 19 Jan 2004 11:06:19 +0100, "Tensibai"
wrote:

Windows ne fonctionne pas avec Deux passerelle par défaut (comme tous les
sytème de routage)
Cette adresse est justement là pour donner une route aux paquets ne
correspondant à aucune entrée dans la table de routage
C'est en général la première qui est utilisée


Je suis désolé, mais je ne suis pas d'accord.
Lorsque deux modems sont connectés sur le même PC, ils sont tous les
deux considérés comme des passerelles "par défaut".

Un accès Internet permet d'atteindre n'importe quelle adresse IP (sauf
celles spécifiées explicitement dans le reste de la table de rourage).

Donc, lorsque 2 modems sont en fonction, chaque interface qui permet
d'accéder à l'Internet est marquée dans la table de routage comme
allant sur 0.0.0.0 masque 0.0.0.0

C'est la métrique qui permet au système d'en choisir l'une ou l'autre
lorsqu'un accès est demandé à une IP quelconque.

J'ai fait le test chez moi avec un modem ADSL en même temps qu'un
modem RTC. En changeant la métrique, je choisis quel est le modem qui
est utilisé pour accéder à l'Internet.

Je peux également spécifier une adresse IP (site Web ou autre) qui
passera par un modem particulier. Ainsi par exemple, je peux accéder à
Google avec le modem RTC, et au reste du web avec le modem ADSL.

C'est ce principe (en dynamique) que je compte utiliser pour permettre
le surf en passant les connexions alternativement sur l'un ou l'autre
des 2 modems ADSL que j'aurai bientôt (dès que ma 2e ligne sera
ouverte).


Il est tout de même possible de géré un changement de passerelle en testant
la connectivité avec la passerelle principale ou en utilisant une trap snmp
(pas facile à mettre en oeuvre pour l'écriture d'un proxy) mais cela sort du
cadre du routage réseau


Il me semble que la solution de routage "dynamique" fonctionne,
d'après les tests que j'ai pu faire.

Oui, là il ouvre une socket sur 62.4.226.23, qui passe donc par la
route qu'il vient de créér.

Heu on bind un sock sur une adresse locale et on le connecte à une adresse

distante ou on lemet en écoute....
Je doit avouer que je ne vois pas exactement l'intéret de créer une route, à
partir du moment où tu as bind ton sock sur une adresse (interface) les
paquets de ce sock seront envoyé par cette interface.


Oui, mais comment "binder" le "sock" explicitement sur l'une ou
l'autre interface avec Windows ?
Si j'ouvre une socket sur une adresse IP quelconque sur Internet, par
exemple 66.102.11.99 (google) sans construire de route spécifique
avant, Windows va choisir l'interface qui a la métrique la plus courte
dans la table de routage, ou en cas d'égalité, la première rencontrée.

Donc, ce sera toujours le même modem qui servira, et l'autre ne fera
rien.

La table de routage ne sera utilisé que si ton programme ne bind pas sur
une adresse spécifique (0.0.0.0 dans la structure sock_inaddr en C) et dans
ce cas le système (du moins la partie réseau) qui se chargera de choisir
l'interface sur laquelle envoyer les paquets en fonction de la tabe de
routage et du coût (METRIC) des routes.


Qu'est-ce que tu appelles une adresse spécifique ? La table de routage
est utilisée pour connaitre l'interface par laquelle établir une
connexion, quelle que soit l'adresse demandée, non ?

Le bind n'étant pas nécessaire pour un sock client, si tu ne le fais pas
explicitement c'est l'OS qui choisi sur quelle interface le créer.


Ben oui, absolument ! C'est justement ce que je veux éviter :))
Je veux pouvoir *choisir* par quelle interface ma socket va passer.

Par ce procédé, le proxy peut décider par quelle interface passent
chacune des connexions demandées par les PC du réseau local, et donc
partager le trafic sur les 2 modems.

Suite à la reflecion précédente, il me paraît finalement plus simple de

jouer avec une table interne au programme pour décider de quelle interface
utiliser, de lier (bind) les sockets (connexion ?, la traduction laisse à
désirer désolé) à l'interface choisie, ce qui permet de contourner le
routage et simplifie (je pense) la dévellopement de la chose :).


OK. Alors peut-être que j'ai mal compris quelque chose sur les
sockets.

Imaginons un cas très simple :

Une appli permet à l'utilisateur d'entrer une adresse IP (ou un nom de
domaine qui sera résolu en IP par une requète DNS).

Le PC ayant 2 modems ADSL branchés, cette appli veut choisir le modem
(donc l'interface) sur lequel établir une connexion.
Comment spécifier l'interface par laquelle passe une connexion par
socket ?

- Il déclare une socket : sock=socket (PF_INET, SOCK_STREAM, 0)
- Il résout l'adresse de l'hote par gethostbyname(serveur);
- Il remplit une structure sockaddr_in avec l'adresse IP sur laquelle
se connecter, ainsi que le port (80)
- Il connecte la socket par connect(...)
- Il envoie la requète HTTP par send (...)
- Il reçoit les données par recv(...)
- Il ferme la socket par closesocket()

Où la-dedans l'application peut-elle spécifier que la connexion
s'ouvre par "modem #1" ou "modem #2" ?

Au fnal tu risque tout de même de réinventer le Network Load Balancing en
fait, tu peux peut être jeter un oiel sur pound
(www.apsis.ch/pound/index_html) qui fait proxy inverse (répartition des
demandes sur plusieurs serveurs web internes)


Là aucun problème. Les serveurs Web internes étant connus à l'avance
(IP, masque de sous-réseau, etc..) les routes spécifiques sont déjà
établies. Ce n'est pas le cas dans l'autre sens, ou une adresse IP
quelconque peut être demandée.

Essaie peut être aussi (si ce n'est déja fait) de jeter un oeil aux
implémentations de NBL sous linux.

Voila, cette fois je suis à court d'idée je pense :))

Tiens moi au courant, ton projet à l'air bien sympathique (si tu veux un
coup de patte sur des fonctions simples je suis disponible :))


Je te remercie !
S'il y a un moyen, lorsque 2 modems internet sont branchés
simultanément, donc permettant tous les deux l'accès au même "réseau"
(n'importe quelle adresse IP non spécifiée explictement dans la table
de routage), de décider quel modem doit être utilisé par la socket,
sans construire une route avant, je suis preneur ! :)

A moins qu'il ne soit possible de faire un bind() sur une socket qui
va être utilisée par un connect(), et ainsi de la lier à l'adresse IP
sortante de l'un ou l'autre des 2 modems ?
En ce cas, quel port choisir pour le bind() ? Un port au hasard ?

Désolé pour ces questions un peu basiques, mais je ne suis pas
(encore) un pro de Winsock.

Merci,

----
Olivier Guillion


Avatar
www.frameip.com
Oui, mais comment "binder" le "sock" explicitement sur l'une ou
l'autre interface avec Windows ?


Il existe une fonction qui s'appelle bind.

Le PC ayant 2 modems ADSL branchés, cette appli veut choisir le modem
(donc l'interface) sur lequel établir une connexion.
Comment spécifier l'interface par laquelle passe une connexion par
socket ?

- Il déclare une socket : sock=socket (PF_INET, SOCK_STREAM, 0)
- Il résout l'adresse de l'hote par gethostbyname(serveur);
- Il remplit une structure sockaddr_in avec l'adresse IP sur laquelle
se connecter, ainsi que le port (80)
- Il connecte la socket par connect(...)
- Il envoie la requète HTTP par send (...)
- Il reçoit les données par recv(...)
- Il ferme la socket par closesocket()

Où la-dedans l'application peut-elle spécifier que la connexion
s'ouvre par "modem #1" ou "modem #2" ?


Idem tu peux rajouter la fonction bind qui va mapper ta socket sur
l'interface (@IP) choisie, mais ce n'est pas obligatoire.


Après création du socket, il s'agit de le lier à un point de communication
défini par une adresse et un port, c'est le rôle de la fonction bind():



bind(int descripteur,sockaddr localaddr,int addrlen)

descripteur représente le descripteur du socket nouvellement créé

localaddr est une structure qui spécifie l'adresse locale à travers laquelle
le programme doit communiquer

Le format de l'adresse est fortement dépendante du protocole utilisé :

l'interface socket définit une structure standard (sockaddr définie dans
<sys/socket.h>) permettant de représenter une adresse:



struct sockaddr

{

u_char sa_len; // longueur effective de l'adresse

u_char sa_family; // famille de protocole (generalement AF_INET)

char sa_data[14]; // l'adresse complete

}



sa_len est un octet (u_char) permettant de définir la longueur utile de
l'adresse (la partie réellement utilisée de sa_data)

sa_family représente la famille de protocole (AF_INET pour TCP/IP)

sa_data est une chaîne de de 14 caractères (au maximum) contenant l'adresse

La structure utilisé avec TCP/IP est une adresse AF_INET (Généralement les
structures d'adresses sont redéfinies pour chaque famille d'adresse). Les
adresses AF_INET utilisent une structure sockaddr_in définie dans
<netinet/in.h> :



Voici un exemple d'utilisation de la fonction bind() :



sockaddr_in localaddr ;

localaddr.sin_family = AF_INET; // Protocole internet

localaddr.sin_addr.s_addr = htonl(INADDR_ANY); // Toutes les adresses IP de
la station

localaddr.sin_port = htons(port); // port d'écoute par défaut au dessus des
ports réservés



if (bind(listen_socket,(struct sockaddr*)&localaddr,sizeof(localaddr) ) = SOCKET_ERROR)

{

// Traitement de l'erreur;

}



Le numéro fictif INADDR_ANY signifie que la socket peut-être associée à
n'importe quelle adresse IP de la machine locale (s'il en existe plusieurs).
Pour spécifier une adresse IP spécifique à utiliser, il est possible
d'utiliser la fonction inet_addr()

inet_addr("127.0.0.1"); // utilisation de l'adresse de boucle locale



La socket peut être reliée à un port libre quelconque en utilisant le
numéro 0



--

SebF

www.frameip.com
Pour ceux qui aiment IP

Avatar
Olivier Guillion
On Wed, 21 Jan 2004 00:15:08 +0100, "www.frameip.com"
wrote:


Oui, mais comment "binder" le "sock" explicitement sur l'une ou
l'autre interface avec Windows ?


Il existe une fonction qui s'appelle bind.


Merci !! Ca va me faciliter la vie !

J'étais bêtement persuadé que bind() ne s'appliquait qu'aux socket "en
écoute", et non aux sockets "clientes".
Mais, en effet, cela fonctionne bien même pour une socket qui est
ensuite utilisée pour un "connect" ! :)))

J'ai cependant encore un seul petit problème :

Si deux modems sont connectés, et que je "binde" ma socket sur celui
qui n'est pas par défaut, c'est bien ce modem qui reçoit les données.

Cependant, je m'aperçois que pendant le transfert, le modem par défaut
ne reçoit rien (ce qui est normal), mais par contre, *émet* des
paquets (La p'tite led "SD" clignote !)

Sont-ce les ACK des paquets de la connexion qui passent par là ?

Si c'est bien cela, le serveur qui m'envoie les paquets va recevoir
des ACK provenant d'une autre IP que celle à qui les paquets sont
destinés. Cela ne peut-il pas poser des problèmes ? Tous les serveurs
les prendront-ils en compte ?

Grand merci,
----
Olivier Guillion


1 2