in reply to Re: Two TCP Connections, one script
in thread Two TCP Connections, one script

Thanks for the responses, looks like the answers give me some things to try. I have a few questions about the code posted:
#! perl -slw use strict; use threads; use Thread::Queue; use IO::Socket; my $Q = new Thread::Queue; my @threads = map async { while( 1 ) { my $s = IO::Socket::INET->new( $_ ) or die $!; while( my $input = <$s> ) { $Q->enqueue( $input ); } sleep 5; } }, 'localhost:12345', 'localhost:6789'; while( my $input = $Q->dequeue ) { chomp $input; if( $input =~ m[Z:] ) { ## Deal with telemetry print "Got telemetry: '$input'"; } else { ## Deal with waypoint; print "Got waypoint: '$input'"; } }
port 12345 will only receive the telemetry in XML format and port 6789 will only send the waypoint XML file. My question would be how can I separate these processes?

Replies are listed 'Best First'.
Re^3: Two TCP Connections, one script
by BrowserUk (Patriarch) on Apr 05, 2008 at 03:52 UTC

    I'm confused. Mostly because you are too I think.

    1. In your OP you said:
      There is a server across the way. This server has two ports allocated, A and B.
      A is port 12345 and its job is to send the telemetry of an aircraft.
      B is port 6789 and its job is to send the waypoint locations.
    2. But in the above post you say:
      port 12345 will only receive the telemetry in XML format and
      port 6789 will only send the waypoint XML file.

    Which is it?

    You'll need to clarify whether the script you want, needs to act

    • as a client to both ports?

      If so, is it reading from both or writing to one of them?

    • or as a client to one and as a server to the other?

    And finally:

    My question would be how can I separate these processes?

    What do you mean by this?

    In the code you reposted, there is an if statement. In one half of it you would be dealing with telemetry data. In the other, waypoint data.

    What problem are you seeing with that?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Sorry for the confusion.
      This post is the correct process of the script:
      1. The telemetry xml file is received on the first port (12345)
      2. The waypoint xml file is sent to the second port (6789)
      The script needs to act as the client to both ports where it is reading from one port (12345) and send to another (6789). The questions I have is how do I know which port I'm reading from and which port I'm sending to?

        If you are reading telemetry from one port and writing (derived?) waypoints to the other, why do you need concurrency? On the surface, it sounds much like a simple filter program using sockets instead of pipes?

        Something as simple as this might be all you need:

        use IO::Socket; use XML::Simple; my $cTelemetry = IO::Socket::INET->new( 'localhost:12345' ) or die $!; my $cWaypoints = IO::Socket::INET->new( 'localhost:6789' ) or die $!; while( <cTelemetry> ) { my $xmlTelemetry = XMLin( $_ ); if( my $xmlWaypoint = deriveWaypoint( $xmlTelemetry ) ){ print $cWaypoints $xmlTelemetry; } }

        That leaves you to write the code for deriving waypoints from telemetry data, but unless that is a slow process, there does not seem much scope for concurrency here?


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.