Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Troubles with Complex Data Structures

by madhatter (Sexton)
on Jan 23, 2001 at 02:54 UTC ( #53608=perlquestion: print w/ replies, xml ) Need Help??
madhatter has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to get information from port 43030 and forward its contents to other IP:Ports. My problem is that the loop runs twice, but uses the first "forward to" IP and port both times.

I can receive data fine, and it forwards information (be it twice to the same IP/port, but my socket code _does_ work)

$CFG{listen_port} = 43030; %data = ( '24.25.32.4' => [ ["192.168.0.3","43035"], ["192.168.0.3","43040"], ], ); $socket = IO::Socket::INET->new(LocalPort => $CFG{listen_port}, Type = +> SOCK_DGRAM, Proto => 'udp') || die "ERROR: can't open socket\n"; while ($socket->recv($in, 1024) ) { $ip = inet_ntoa($socket->peeraddr); # print "Info from $ip"; foreach(@{$data{$ip}}){ my $tip = ${$_}[0]; $sock = IO::Socket::INET->new(Proto => 'udp', PeerPort => +$data{$ip}[$tip][1], PeerAddr => $data{$ip}[$tip][0]); $sock->send($in) or die "send: $!"; print "Sent to $data{$ip}[$tip][0]:$data{$ip}[$tip][1]\n"; } print $in; }

I don't usually mess with complex data structures because of problems like this. Once I get this worked out though, and I can loop through different layers, I think they'll come in handy.

Any help on how to get it to loop properly would be greatly appreciated. Note: I'm using extra variables to try to make things easier. ($tip = temporary IP) I realize the code sucks. I haven't cleaned it up yet.

Thanks for any help you could offer,
madhatter

Comment on Troubles with Complex Data Structures
Download Code
Re: Troubles with Complex Data Structures
by chipmunk (Parson) on Jan 23, 2001 at 03:10 UTC
    $tip will hold an IP address, but you're using it as an array index.

    Here's how I might write the foreach loop:

    foreach my $ip_port (@{$data{$ip}}) { # $ip_port = ["192.168.0.3"," +43035"]; $sock = IO::Socket::INET->new(Proto => 'udp', PeerAddr => $ip_port->[0], PeerPort => $ip_port->[1] ); $sock->send($in) or die "send: $!"; print "Sent to $ip_port->[0]:$ip_port->[1]\n"; }
    The trick here is that, once you have a reference to a sublevel of the data structure -- in this case $ip_port, which points to one of the inner arrays -- you can work directly from that reference.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://53608]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (12)
As of 2014-10-30 12:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (206 votes), past polls