BrowserUk,,

I took a while to respond. Here is working code showing what I'm trying too improve. ( I looked at the named pipes, but that seemed to imply a parent/child situation.) I used the plain socket code shown below to describe the situation. On the system I'm testing, the cost of building the socket each time more than doubles the total time of the transaction.

How to use the client/server code: Start the server first. Then one or more client(s), which will show the times for opening the connection, total time of the transaction and then the percentage of overhead.

Server:

use strict; use warnings; use Time::HiRes qw( gettimeofday usleep ); use Socket; my $server_port = 3000; # make the socket socket(Server, PF_INET, SOCK_STREAM, getprotobyname('tcp')); # so we can restart our server quickly setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1); # build up my socket address my $my_addr = sockaddr_in($server_port, INADDR_ANY); bind(Server, $my_addr) or die "Couldn't bind to port $server_port: $!\n"; # establish a queue for incoming connections # print SOMAXCONN, "\n"; listen(Server, SOMAXCONN) or die "Couldn't listen on port $server_port: $!\n"; while ( 1 ) { my $WorkName = "FBServer"; my $cnt = 0; my $result = ""; while ( 1 ) { $cnt++; my $client; $0 = "$WorkName: Waiting for work!"; accept( $client, Server ); if ( defined $client ) { my $tm = substr(scalar localtime(),4,15); $0 = "$WorkName: Working ( $cnt ) $tm"; my $stime = gettimeofday; my $html = ""; my $Todo = "" +; my $size = 0; $0 = "$WorkName: Read Socket ( $cnt ) $tm"; eval { while (<$client>) { $Todo .= "$_"; chomp($Todo); } }; if ( $@ ) { my $err = $@; print $client "$err\n"; syslog('alert', "2 ERROR: $err"); last; } if ( $Todo ) { chomp($Todo); ## Debian patch print "$Todo ", sprintf("%0.8f",gettimeofday - $ +stime),"\n"; print $client "Client $Todo: Thank you!\n"; close ( $client ); }; } } } exit;
Client:
use strict; use warnings; use Socket; use Time::HiRes qw( gettimeofday usleep ); our @Total = (); our $Totcnt = 500; our $remote_host = "172.16.47.22"; our $remote_port = 3000; for ( 0..$Totcnt ) { my $parms = $$; my $result = Call_Multi_User( $parms ); if ( ! $result ) { print "\t****Nothing Back\n"; } print "$result\n"; usleep 20000; } my $open = $Total[0]; my $total = $Total[1]; my $diff = ( $total / $open ) - 1 ; $open = $Total[0] / $Totcnt; my $total = $Total[1] / $Totcnt; print "\n\tTotals:\t\t\t".sprintf("%0.8f",$open) . "\t".sprintf("% +0.8f",$total)."\t+ ".sprintf("%0.3f",$diff)." %\n\n"; exit; sub Call_Multi_User { my $Todo = shift; if ( ! defined $Todo ) { return( "" ); } our $server; my $stime = gettimeofday; my $answer = ""; # if ( ! $server ) ## if this worked then we wouldn't have t +he establish overhead! { socket( $server, PF_INET, SOCK_STREAM, getprotobyname('tcp +')); # create a socket # build the address of the remote machine my $internet_addr = inet_aton($remote_host) or die "Couldn't convert $remote_host into an Inte +rnet address: $!\n"; my $paddr = sockaddr_in($remote_port, $internet_addr); # connect connect($server, $paddr) or die "Couldn't connect to $remote_host:$remote_p +ort: $!\n"; select((select($server), $| = 1)[0]); # enable command bu +ffering } my $open = gettimeofday - $stime; print $server "$Todo\n"; shutdown($server,1); # my $no = 0; while (<$server>) { $answer .= $_; } close $server; chomp($answer); my $total = gettimeofday - $stime; my $diff = ( $total / $open ) - 1 ; $Total[0] += $open; $Total[1] += $total; $answer .= "\t".sprintf("%0.8f",$open) . "\t".sprintf("%0.8f", +$total)."\t+ ".sprintf("%0.3f",$diff)." %"; return ( $answer ); }
Client output: Client 24006: Thank you! 0.00029397 0.00068903 + 1.34 +4 % Client 24006: Thank you! 0.00030303 0.00076103 + 1.51 +1 % Client 24006: Thank you! 0.00030303 0.00061202 + 1.02 +0 % Client 24006: Thank you! 0.00033212 0.00082612 + 1.48 +7 % Client 24006: Thank you! 0.00037408 0.00084996 + 1.27 +2 % Client 24006: Thank you! 0.00030398 0.00110912 + 2.64 +9 % Totals (Average): 0.00021664 0.00051245 + 1.36 +5 % Server output: ( 2 clients running ) 24006 0.00013709 24007 0.00002718 24007 0.00003099 24006 0.00002503 24007 0.00013399 24006 0.00002623 24006 0.00003099 24007 0.00002503 24006 0.00013494 24007 0.00002503 24007 0.00003099 24006 0.00002503 24007 0.00013399 24006 0.00002599

Thank you

"Well done is better than well said." - Benjamin Franklin


In reply to Re^4: How to maintain a persistent connection over sockets? by flexvault
in thread How to maintain a persistent connection over sockets? by flexvault

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.