Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <h1>Revised Edition of Answer</h1> <p>This code includes 3 scripts:</p> <ol> <li><code>serverJ.pl</code> which is an iterative server, processing one request at a time, but continuing to process multiple requests;</li> <li><code>clientJ.pl</code> which is a simple client that sends the login request from the <code>Login.txt</code> file and echoes what it receives from the server; and</li> <li><code>clientQ.pl</code> which sends a QUIT message to the server.</li> </ol> <p>I've left the code using old-fashioned file handles rather than upgrading to modern lexical file handles, but I changed to the 3-argument form of <code>open</code>. One other change is that most messages are prefixed with <code>$$:</code>, the Perl process ID. I would not have labelled the <code>INNER:</code> loop except for symmetry with the <code>OUTER:</code> loop, which does need a label. It is not clear that the functions <code>send_login()</code> and <code>abc()</code> are needed in <code>clientJ.pl</code>; they are left in deference to the original code.</p> <h3>serverJ.pl</h3> <pre><code>#!/usr/bin/env perl use strict; use warnings; use IO::Socket::INET; my $socket = new IO::Socket::INET ( LocalHost =&gt; '127.0.0.1', LocalPort =&gt; '1055', Proto =&gt; 'tcp', Listen =&gt; 1, Reuse =&gt; 1 ) or die "Oops: $! \n"; print "$$: waiting for clients.\n"; server_loop(); $socket-&gt;close(); sub server_loop { OUTER: while (my $clientsocket = $socket-&gt;accept()) { print "$$: connected from : ", $clientsocket-&gt;peerhost(); print ", port : ", $clientsocket-&gt;peerport(), "\n"; INNER: while (&lt;$clientsocket&gt;) { print"$$: Message received from Client : $_"; last INNER if ($_ eq "\$END\$\n"); last OUTER if ($_ eq "\$QUIT\$\n"); print $clientsocket $_; } my $login_ack = "login_ack.txt"; open LOGINACK, '&lt;', $login_ack or die "Cannot open login acknowledgment file $login_ack ($!)\n"; my @loginack = &lt;LOGINACK&gt;; close LOGINACK; my $logfile = "logfile.txt"; open LOG, "&gt;&gt;", $logfile or die "$$: cannot open $logfile ($!)\n"; foreach my $loginack (@loginack) { last if ($loginack eq "\$END\$\n"); print $clientsocket $loginack; print LOG "$$: $loginack"; print "$$: server to client: $loginack"; } close LOG; close $clientsocket; } } </code></pre> <h3>clientJ.pl</h3> <pre><code>#!/usr/bin/env perl use strict; use warnings; use IO::Socket::INET; my $socket = new IO::Socket::INET ( PeerHost =&gt; '127.0.0.1', PeerPort =&gt; '1055', Proto =&gt; 'tcp', Reuse =&gt; 1 ) or die "$!\n"; print "$$: connected to the server.\n"; send_login(); abc(); $socket-&gt;close(); sub send_login { my $login_txt = "Login.txt"; open LOGIN, '&lt;', $login_txt or die "Cannot open $login_txt $!\n"; my @login = &lt;LOGIN&gt;; close LOGIN; my $logfile = "logfile.txt"; open LOG, '&gt;&gt;', $logfile or die "Cannot open $logfile ($!)\n"; foreach my $login (@login) { print $socket $login; print LOG "$$: $login"; print "$$: sent to server: $login"; last if ($login eq "\$END\$\n"); } close LOG; } sub abc { while (&lt;$socket&gt;) { print"$$: Message received from Server: $_"; } } </code></pre> <h3>clientQ.pl</h3> <pre><code>#!/usr/bin/env perl use strict; use warnings; use IO::Socket::INET; my $socket = new IO::Socket::INET( PeerHost =&gt; '127.0.0.1', PeerPort =&gt; '1055', Proto =&gt; 'tcp', Reuse =&gt; 1 ) or die "$!\n"; print $socket "\$QUIT\$\n"; $socket-&gt;close(); </code></pre> <h3>Sample log</h3> <pre><code>$ perl serverJ.pl 2&gt;&amp;1 &amp; [1] 87610 $ 87610: waiting for clients. $ perl clientJ.pl | so 87610: connected from : 127.0.0.1, port : 57143 87610: Message received from Client : SAS4 87610: Message received from Client : 50 87610: Message received from Client : SAS_ACTION LOGIN 87610: Message received from Client : LOGIN bss 87610: Message received from Client : PASSWORD cleint 87610: Message received from Client : $END$ 87610: server to client: SAS4 87610: server to client: 61 87610: server to client: SAS_ACTION LOGIN_ACK 87610: server to client: ACK_STATUS 0 87610: server to client: ACK_MESSAGE Logged In 87614: connected to the server. 87614: sent to server: SAS4 87614: sent to server: 50 87614: sent to server: SAS_ACTION LOGIN 87614: sent to server: LOGIN bss 87614: sent to server: PASSWORD cleint 87614: sent to server: $END$ 87614: Message received from Server: SAS4 87614: Message received from Server: 50 87614: Message received from Server: SAS_ACTION LOGIN 87614: Message received from Server: LOGIN bss 87614: Message received from Server: PASSWORD cleint 87614: Message received from Server: SAS4 87614: Message received from Server: 61 87614: Message received from Server: SAS_ACTION LOGIN_ACK 87614: Message received from Server: ACK_STATUS 0 87614: Message received from Server: ACK_MESSAGE Logged In $ perl clientJ.pl | so 87610: connected from : 127.0.0.1, port : 57144 87610: Message received from Client : SAS4 87610: Message received from Client : 50 87610: Message received from Client : SAS_ACTION LOGIN 87610: Message received from Client : LOGIN bss 87610: Message received from Client : PASSWORD cleint 87610: Message received from Client : $END$ 87610: server to client: SAS4 87610: server to client: 61 87610: server to client: SAS_ACTION LOGIN_ACK 87610: server to client: ACK_STATUS 0 87610: server to client: ACK_MESSAGE Logged In 87617: connected to the server. 87617: sent to server: SAS4 87617: sent to server: 50 87617: sent to server: SAS_ACTION LOGIN 87617: sent to server: LOGIN bss 87617: sent to server: PASSWORD cleint 87617: sent to server: $END$ 87617: Message received from Server: SAS4 87617: Message received from Server: 50 87617: Message received from Server: SAS_ACTION LOGIN 87617: Message received from Server: LOGIN bss 87617: Message received from Server: PASSWORD cleint 87617: Message received from Server: SAS4 87617: Message received from Server: 61 87617: Message received from Server: SAS_ACTION LOGIN_ACK 87617: Message received from Server: ACK_STATUS 0 87617: Message received from Server: ACK_MESSAGE Logged In $ perl clientQ.pl | so 87610: connected from : 127.0.0.1, port : 57147 87610: Message received from Client : $QUIT$ [1]+ Done perl serverJ.pl 2&gt;&amp;1 $ </code></pre> <hr> <h3>Post loop code executes</h3> <blockquote> <p>In the server script, while sending the acknowledgement, the code after the <code>foreach my $loginack (@loginack)</code> loop does not get executed. I think that is because the code cannot break out of the loop. How shall it be dealt with?</p> </blockquote> <p>Mildly modified code in <code>serverJ.pl</code>:</p> <pre><code> foreach my $loginack (@loginack) { last if ($loginack eq "\$END\$\n"); print $clientsocket $loginack; print LOG "$$: $loginack"; print "$$: server to client: $loginack"; } print "$$: End of Loop\n"; close LOG; close $clientsocket; print "$$: After close\n"; </code></pre> <p>Example run:</p> <pre><code>$ perl serverJ.pl &amp; [1] 6913 $ 6913: waiting for clients. $ perl clientJ.pl 6915: connected to the server. 6913: connected from : 127.0.0.1, port : 52454 6915: sent to server: This is the file Login.txt 6913: Message received from Client : This is the file Login.txt 6915: sent to server: It contains more than 1 line 6915: sent to server: It also contains this one 6915: sent to server: $END$ 6913: Message received from Client : It contains more than 1 line 6913: Message received from Client : It also contains this one 6913: Message received from Client : $END$ 6915: Message received from Server: This is the file Login.txt 6915: Message received from Server: It contains more than 1 line 6915: Message received from Server: It also contains this one 6913: server to client: This is the file login_ack.txt 6913: server to client: As with the other file, it contains multiple lines 6913: server to client: Several of them. 6913: server to client: This is one of them. 6915: Message received from Server: This is the file login_ack.txt 6913: End of Loop 6915: Message received from Server: As with the other file, it contains multiple lines 6915: Message received from Server: Several of them. 6915: Message received from Server: This is one of them. 6913: After close $ perl clientQ.pl 6913: connected from : 127.0.0.1, port : 52455 6913: Message received from Client : $QUIT$ [1]+ Done perl serverJ.pl $ </code></pre> <hr> <h1>Original Edition of Answer</h1> <p>This code seems to work for me (for a loose definition of 'works'). It is closely based on your code, but using socket 1055 instead of 0155 (I run on Unix; I'd have to be root to use a port number less than 1024), and with <code>use strict;</code> and <code>use warnings;</code> and other minor cleanups.</p> <h3>server.pl</h3> <pre><code>#!/usr/bin/env perl use strict; use warnings; use IO::Socket::INET; my $socket = new IO::Socket::INET( LocalHost =&gt; '127.0.0.1', LocalPort =&gt; '1055', Proto =&gt; 'tcp', Listen =&gt; 1, Reuse =&gt; 1 ) or die "Oops: $! \n"; print "Waiting for the Client.\n"; my $clientsocket; while ($clientsocket = $socket-&gt;accept()) { print "Connected from : ", $clientsocket-&gt;peerhost(); print ", Port : ", $clientsocket-&gt;peerport(), "\n"; while (&lt;$clientsocket&gt;) { if ($_ ne "\$END\$\n") { print"Message received from Client : $_"; print $clientsocket $_; } else { print"\$END\$\n"; } } last; } login_ack(); sub login_ack { # Some code removed for the purpose of posting open (LOGINACK, "login_ack.txt") || die "Cannot open login acknowledgment file $!\n"; my @loginack=&lt;LOGINACK&gt;; close LOGINACK; open(LOG, "&gt;&gt;logfile.txt"); foreach my $loginack (@loginack) { if ($loginack ne "\$END\$\n") { print $clientsocket $loginack; print LOG $loginack; print $loginack; } else { print"\$END\$\n"; } } } </code></pre> <h3>client.pl</h3> <pre><code>#!/usr/bin/env perl use strict; use warnings; use IO::Socket::INET; my $socket = new IO::Socket::INET ( PeerHost =&gt; '127.0.0.1', PeerPort =&gt; '1055', Proto =&gt; 'tcp', Reuse =&gt; 1) or die "$!\n"; print "Connected to the Server.\n"; send_login(); sub send_login { # Some code removed for the purpose of posting open (LOGIN, "Login.txt") || die "Cannot open login file $!\n"; my @login=&lt;LOGIN&gt;; close LOGIN; open(LOG, "&gt;&gt;logfile.txt"); foreach my $login (@login) { if ($login ne "\$END\$\n") { print $socket $login; print LOG $login; print $login; } else { print"\$END\$\n"; } } } LOGINACK: while (&lt;$socket&gt;) { print"Message received from Server : $_"; print $socket $_; last LOGINACK; } </code></pre> <h3>Login.txt</h3> <pre><code>This is the content of the Login.txt file. $END$ </code></pre> <h3>login_ack.txt</h3> <pre><code>This is the contents of the login_ack.txt file. It has two lines of text plus the $END$ line. $END$ </code></pre> <h3>Sample output</h3> <pre><code>$ perl server.pl &amp; [1] 74838 $ Waiting for the Client. $ perl client.pl | so Connected from : 127.0.0.1, Port : 51109 Message received from Client : This is the content of the Login.txt file. Message received from Client : This is the content of the Login.txt file. Connected to the Server. This is the content of the Login.txt file. $END$ Message received from Server : This is the content of the Login.txt file. This is the contents of the login_ack.txt file. It has two lines of text plus the $END$ line. $END$ [1]+ Done perl server.pl $ </code></pre> <p>The server terminates after responding to a single request.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload