OVH Cloud OVH Cloud

Socket

4 réponses
Avatar
Scetbon Cyril
Bonjour,

J'ai défini 3 adresses IP pour mon interface réseau de façon a avoir les
interfaces suivantes:
eth0 192.168.1.1
eth0:1 192.168.1.2
eth0:2 192.168.1.3

J'ai utilisé le code suivant pour écrire un exemple de serveur udp.
Par contre, je ne trouve pas la possibilité de savoir à quelle interface
c'était destiné. $sock->sockhost me donne l'adresse 0.0.0.0.

Une idée ?

use strict;
use IO::Socket;
my($sock, $newmsg,$hishost,$host, $MAXLEN, $PORTNO);
$MAXLEN = 1024;
$PORTNO = 161;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => 'udp')
or die "socket: $@";
print "Awaiting UDP messages on port $PORTNO\n";
while ($sock->recv($newmsg, $MAXLEN)) {
$hishost = $sock->peerhost;
$host = $sock->sockhost;
print "Client $hishost called\n";
print "Host $host was called\n";
}
die "recv: $!";

4 réponses

Avatar
dominix
Scetbon Cyril wrote:
Bonjour,

J'ai défini 3 adresses IP
...

Par contre, je ne trouve pas la possibilité de savoir à quelle
interface c'était destiné. $sock->sockhost me donne l'adresse 0.0.0.0.

Une idée ?


0.0.0.0 c'est toute tes interfaces en même temps

si tu n'en veux qu'une particuliere ...

use strict;
use IO::Socket;
my($sock, $newmsg,$hishost,$host, $MAXLEN, $PORTNO);
$MAXLEN = 1024;
$PORTNO = 161;


$LOCADDR = "192.168.1.2";
$sock = IO::Socket::INET->new(LocalAddr => $LOCADDR,
LocalPort => $PORTNO,
Proto => 'udp') or creve_charogne()

--
dominix

Avatar
Scetbon Cyril
exact.
J'ai vu ça hier.
Apparemment, je suis obligé de faire l'écoute sur chacune des interfaces.

Il n'y a pas un moyen, en écoutant sur toutes les interfaces en même
temps, de savoir sur laquelle le message est arrivé ?

dominix wrote:
Scetbon Cyril wrote:

Bonjour,

J'ai défini 3 adresses IP


...

Par contre, je ne trouve pas la possibilité de savoir à quelle
interface c'était destiné. $sock->sockhost me donne l'adresse 0.0.0.0.

Une idée ?



0.0.0.0 c'est toute tes interfaces en même temps

si tu n'en veux qu'une particuliere ...


use strict;
use IO::Socket;
my($sock, $newmsg,$hishost,$host, $MAXLEN, $PORTNO);
$MAXLEN = 1024;
$PORTNO = 161;



$LOCADDR = "192.168.1.2";
$sock = IO::Socket::INET->new(LocalAddr => $LOCADDR,
LocalPort => $PORTNO,
Proto => 'udp') or creve_charogne()




Avatar
dominix
Scetbon Cyril wrote:

[SVP pas de post a l'envers]

dominix wrote:
Scetbon Cyril wrote:

Bonjour,

J'ai défini 3 adresses IP
...

Par contre, je ne trouve pas la possibilité de savoir à quelle
interface c'était destiné. $sock->sockhost me donne l'adresse
0.0.0.0.
Une idée ?


0.0.0.0 c'est toute tes interfaces en même temps



exact.
J'ai vu ça hier.
Apparemment, je suis obligé de faire l'écoute sur chacune des
interfaces.

Il n'y a pas un moyen, en écoutant sur toutes les interfaces en même
temps, de savoir sur laquelle le message est arrivé ?



En UDP (mode non connecté) le systeme lui meme ne le sait qu'au
niveau des couches ISO primitives. Avec un seul process pour avoir
la connaissance de l'interface utilisé, il faut utiliser le proto
TCP ou bien le mode cru 'Net::RawIP' (bonjour la complication).
sinon dans ton cas il faut autant de process que d'interface, ou
bien deduire l'interface en fonction de l'adresse du client.(tres
incertain)

--
dominix



Avatar
Scetbon Cyril
Je me suis rabattu sur l'écoute de chaque interface.

Merci

dominix wrote:
Scetbon Cyril wrote:

[SVP pas de post a l'envers]


dominix wrote:

Scetbon Cyril wrote:


Bonjour,

J'ai défini 3 adresses IP


...

Par contre, je ne trouve pas la possibilité de savoir à quelle
interface c'était destiné. $sock->sockhost me donne l'adresse
0.0.0.0.
Une idée ?


0.0.0.0 c'est toute tes interfaces en même temps





exact.
J'ai vu ça hier.
Apparemment, je suis obligé de faire l'écoute sur chacune des
interfaces.

Il n'y a pas un moyen, en écoutant sur toutes les interfaces en même
temps, de savoir sur laquelle le message est arrivé ?




En UDP (mode non connecté) le systeme lui meme ne le sait qu'au
niveau des couches ISO primitives. Avec un seul process pour avoir
la connaissance de l'interface utilisé, il faut utiliser le proto
TCP ou bien le mode cru 'Net::RawIP' (bonjour la complication).
sinon dans ton cas il faut autant de process que d'interface, ou
bien deduire l'interface en fonction de l'adresse du client.(tres
incertain)