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

[HS] Adresse IP

10 réponses
Avatar
François Boisson
Un truc idiot en C, je crée une socket UDP qui envoit des paquets à une
machine donnée. Je cherche l'adresse IP sous laquelle j'apparaitrais à
la cible (en clair l'adresse IP d'où proviendra le paquet que la machine
recevra si on suppose l'absence de NAT bien sûr). Un getsockname me
renvoit 0.0.0.0 (IPPADR_ANY en fait). Y-a-t-il une méthode simple, ça
me parait tout bête mais je n'ai rien trouvé dans mon pavé de référence
("Programmation système en C sous linux" par Christophe Blaess).

Merci

François Boisson

PS: Merci de ne pas (trop) rigoler si la solution est immédiate!



--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

10 réponses

Avatar
Jean-Michel OLTRA
bonjour,


Le lundi 04 avril 2005, François Boisson a écrit...


Un truc idiot en C, je crée une socket UDP qui envoit des paquets à une
machine donnée. Je cherche l'adresse IP sous laquelle j'apparaitrais à
la cible (en clair l'adresse IP d'où proviendra le paquet que la machine
recevra si on suppose l'absence de NAT bien sûr). Un getsockname me
renvoit 0.0.0.0 (IPPADR_ANY en fait). Y-a-t-il une méthode simple, ça
me parait tout bête mais je n'ai rien trouvé dans mon pavé de référence
("Programmation système en C sous linux" par Christophe Blaess).



getpeername() ??

--
jm


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
François Boisson
Le Mon, 4 Apr 2005 12:04:01 +0200
Jean-Michel OLTRA a écrit:


bonjour,


Le lundi 04 avril 2005, François Boisson a écrit...


> Un truc idiot en C, je crée une socket UDP qui envoit des paquets à
> une machine donnée. Je cherche l'adresse IP sous laquelle
> j'apparaitrais à la cible (en clair l'adresse IP d'où proviendra le
> paquet que la machine recevra si on suppose l'absence de NAT bien
> sûr). Un getsockname me renvoit 0.0.0.0 (IPPADR_ANY en fait).
> Y-a-t-il une méthode simple, ça me parait tout bête mais je n'ai
> rien trouvé dans mon pavé de référence ("Programmation système en C
> sous linux" par Christophe Blaess).

getpeername() ??




Non getpeername donne des renseignements sur la machine à l'autre bout
(B dans ci dessous alors que je veux A): Je vais être plus clair:

Une socket sur A envoit des paquets vers B, comment le programme en A
peut-il connaitre l'IP sous laquelle il envoit les paquets (l'IP de la
machine A donc). Si il y a plusieurs cartes réseaux, le pbm n'est pas si
simple, je pensais qu'un getsockname juste après un envoi de paquet
renverrait les informations mais non, ça ne permet de connaitre que le
numéro de port utilisé...

Merci en tout cas

François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Sylvain Sauvage
Mon, 4 Apr 2005 13:59:38 +0200, François Boisson a écrit :
[...]
Une socket sur A envoit des paquets vers B, comment le programme en A
peut-il connaitre l'IP sous laquelle il envoit les paquets (l'IP de la
machine A donc). Si il y a plusieurs cartes réseaux, le pbm n'est pas si
simple, je pensais qu'un getsockname juste après un envoi de paquet
renverrait les informations mais non, ça ne permet de connaitre que le
numéro de port utilisé...



Si tu ne spécifie pas l'IP de la socket, les paquets UDP sont envoyés s ur
toutes les IP de la machine A (d'où le any). C'est ensuite au niveau IP
(le niveau sous UDP) que les paquets sont routés.

Je pense que ce que tu voudrais, c'est que le noyau t'informe de
l'interface/IP qui a servi à envoyer ce paquet.

Mais ce paquet est déjà parti !

Il faudrait :
1/ soit que la socket soit modifiée (plus en any)
2/ soit que les infos de routage remontent dans le paquet.

Pour le 1/, tu peux envoyer d'autres paquets par cette socket mais vers
n'importe quelle autre adresse (d'où le any). La socket n'est pas modifi ée
(elle reste en any).

Pour le 2/, ben je ne connais pas par c½ur toutes les fonctions C sur les
paquets UDP mais il ne me semble pas que cela soit possible (en tout cas
les infos ne sont pas dans la socket).

Une solution, c'est que le receveur de ton paquet UDP te renvoie ton
adresse dans sa réponse. Ou bien tu recherches le nom de la machine sur
laquelle tu travailles.

Mes 2 ¢,
--
Sylvain Sauvage
Avatar
François Boisson
Le Mon, 4 Apr 2005 15:11:42 +0200
Sylvain Sauvage a écrit:

Si tu ne spécifie pas l'IP de la socket, les paquets UDP sont envoyés
sur toutes les IP de la machine A (d'où le any). C'est ensuite au
niveau IP(le niveau sous UDP) que les paquets sont routés.



Oui

Je pense que ce que tu voudrais, c'est que le noyau t'informe de
l'interface/IP qui a servi à envoyer ce paquet.


Oui


Mais ce paquet est déjà parti !


Ben oui


Il faudrait :
1/ soit que la socket soit modifiée (plus en any)


Préciser l'IP de départ dans ce cas, c'est ça?

2/ soit que les infos de routage remontent dans le paquet.


Oui, ce serait l'idéal..


Pour le 1/, tu peux envoyer d'autres paquets par cette socket mais
vers n'importe quelle autre adresse (d'où le any). La socket n'est pas
modifiée(elle reste en any).


C'est bien ce que j'ai vu (et c'est logique)


Pour le 2/, ben je ne connais pas par c_ur toutes les fonctions C sur
les paquets UDP mais il ne me semble pas que cela soit possible (en
tout cas les infos ne sont pas dans la socket).


C'est la conclusion que je commençais à envisager. C'est vrai qu'en
réfléchissant, c'est un problème en aval de la socket et qu'il n'y a
aucune raison d'un retour d'information...


Une solution, c'est que le receveur de ton paquet UDP te renvoie ton
adresse dans sa réponse.


Exclus dans mon cas :(

Ou bien tu recherches le nom de la machine
sur laquelle tu travailles.


Grosse flemme, j'ai rajouté une option -i par laquelle l'utilisateur dit
l'IP utilisée. Moche mais bon...


Mes 2 ¢,



Je vois souvent ça mais je n'ai jamais osé demander, ça veut dire quoi
exactement?


Mes 2¢ aussi quand même et merci


François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Jean-Michel OLTRA
bonjour,


Le lundi 04 avril 2005, Sylvain Sauvage a écrit...


> Une socket sur A envoit des paquets vers B, comment le programme en A
> peut-il connaitre l'IP sous laquelle il envoit les paquets (l'IP de la
> machine A donc). Si il y a plusieurs cartes réseaux, le pbm n'est pas si
> simple, je pensais qu'un getsockname juste après un envoi de paquet
> renverrait les informations mais non, ça ne permet de connaitre que le
> numéro de port utilisé...



mille excuses, j'avais compris le contraire.

Pour le 2/, ben je ne connais pas par c½ur toutes les fonctions C sur les
paquets UDP mais il ne me semble pas que cela soit possible (en tout cas
les infos ne sont pas dans la socket).



Il n'est pas possible de jouer avec le champ sa_data de struct sockaddr ?
bits/socket.h donne, pour cette struct :
char sa_data[14]; /* Address data. */
mais j'en sais pas plus...faudrait faire un peu de doc...

Sinon capturer un paquet envoyé avec la libpcap et l'analyser ?

--
jm


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
fra-duf-no-spam
Le 12877ième jour après Epoch,
François Boisson écrivait:

Le Mon, 4 Apr 2005 15:11:42 +0200
Sylvain Sauvage a écrit:

Il faudrait :
1/ soit que la socket soit modifiée (plus en any)


Préciser l'IP de départ dans ce cas, c'est ça?



C'est un peu ça. Mais si tu as plusieurs interfaces, comme c'est le
noyau (le routage) qui va décider par où ça sort, ça peut être
embêtant.

Une solution, c'est que le receveur de ton paquet UDP te renvoie ton
adresse dans sa réponse.


Exclus dans mon cas :(



Si tu as une réponse de tes DATAGRAMS, alors tu peux regarder à quelle
IP cette réponse est destinée, et tu as ton info. Sinon, tu peux jouer
avec "RECORD_ROUTE", mais je ne sais plus trop comment ça marche.

Mes 2 ¢,



Je vois souvent ça mais je n'ai jamais osé demander, ça veut dire quoi
exactement?



Ça doit probablement venir de l'expression "Une réponse à 2 balles"
... Ça signifie une réponse qui vaut pas plus cher que ça ;)

Mes 2 ¢


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Gabriel Paubert
On Mon, Apr 04, 2005 at 01:59:38PM +0200, François Boisson wrote:
Le Mon, 4 Apr 2005 12:04:01 +0200
Jean-Michel OLTRA a écrit:

>
> bonjour,
>
>
> Le lundi 04 avril 2005, François Boisson a écrit...
>
>
> > Un truc idiot en C, je crée une socket UDP qui envoit des paquets à
> > une machine donnée. Je cherche l'adresse IP sous laquelle
> > j'apparaitrais à la cible (en clair l'adresse IP d'où proviendra le
> > paquet que la machine recevra si on suppose l'absence de NAT bien
> > sûr). Un getsockname me renvoit 0.0.0.0 (IPPADR_ANY en fait).
> > Y-a-t-il une méthode simple, ça me parait tout bête mais je n'ai
> > rien trouvé dans mon pavé de référence ("Programmation système en C
> > sous linux" par Christophe Blaess).
>
> getpeername() ??
>

Non getpeername donne des renseignements sur la machine à l'autre bout
(B dans ci dessous alors que je veux A): Je vais être plus clair:

Une socket sur A envoit des paquets vers B, comment le programme en A
peut-il connaitre l'IP sous laquelle il envoit les paquets (l'IP de la
machine A donc). Si il y a plusieurs cartes réseaux, le pbm n'est pas si
simple, je pensais qu'un getsockname juste après un envoi de paquet
renverrait les informations mais non, ça ne permet de connaitre que le
numéro de port utilisé...



Ça ne marche pas si tu fais un connect(2) sur B avant un
getsockname? Je crois qu'il n'y même pas besoin faire un
send/sendto/sendmsg avant.

Ça devrait si je comprends le code du noyau qui passe par
net/ipv4/af_inet.c:inet_dgram_connect. Tu peux désassocier
ton socket si tu veux en faisant un connect(2) à un socket
de famille AF_UNSPEC.

Gabriel


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Sylvain Sauvage
Mon, 04 Apr 2005 16:33:07 +0200, François TOURDE a écrit :
Le 12877ième jour après Epoch,
François Boisson écrivait:

> Le Mon, 4 Apr 2005 15:11:42 +0200
> Sylvain Sauvage a écrit:
[...]
>> Mes 2 ¢,
>
> Je vois souvent ça mais je n'ai jamais osé demander, ça veut dire quoi
> exactement?

Ça doit probablement venir de l'expression "Une réponse à 2 balles"
.... Ça signifie une réponse qui vaut pas plus cher que ça ;)

Mes 2 ¢



Pas d'accord : une réponse à deux balles serait une réponse bâclé e, que
l'on sait mauvaise et très approximative.
« Mes 2 ¢ », c'est plutôt : j'apporte ma (petite) pierre à l'éd ifice.
Sous-entendu : voilà ce que j'ai compris, ce que je devine, ce que
j'intuite, un /educated guess/.
Ça signifie aussi : je ne suis pas spécialiste, corrigez-moi si je me
trompe, etc.

Par contre, pourquoi 2 ¢ ?
Hop, googlons un peu :
Et bien cela viendrait de « put my 2 bits » qui correspond à mettre d eux
pièces de 25 ¢ (1 bit = 1 quarter) dans le pot au poker pour entrer d ans
le jeu : http://members.aol.com/MorelandC/HaveOriginsData.htm

Voilà, mes 2 ¢ ;o)
...ou comment faire du HS dans un fil déjà marqué HS

--
Sylvain Sauvage
Avatar
François Boisson
Le Mon, 4 Apr 2005 19:07:44 +0200
Gabriel Paubert a écrit:

Ça ne marche pas si tu fais un connect(2) sur B avant un
getsockname? Je crois qu'il n'y même pas besoin faire un
send/sendto/sendmsg avant.

Ça devrait si je comprends le code du noyau qui passe par
net/ipv4/af_inet.c:inet_dgram_connect. Tu peux désassocier
ton socket si tu veux en faisant un connect(2) à un socket
de famille AF_UNSPEC.




J'aurais du y penser, C'est vrai que le connect en UDP est en général
inutile mais bon.. Je finis de me débattre dans l'extraction de données
puis la mise en place de la base Mysql et je fais l'essai...


Merci

François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
François Boisson
Le Tue, 5 Apr 2005 17:46:06 +0200
Sylvain Sauvage a écrit:


Voilà, mes 2 ¢ ;o)
...ou comment faire du HS dans un fil déjà marqué HS



Pas grave ça.. Merci aux deux réponses :)


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact