evilstevel has asked for the wisdom of the Perl Monks concerning the following question:

I have a simple tcp server script, executed by inetd, that processes a string of switches and data. Though it functions properly most of the time, it sometimes grabs only a portion of the string. I have verified that the string reaches the box from the client. I have also tried it against both SUN and SGI boxes with the same results.

Some simple test code that produces the same results:

$string = <STDIN>;
print $string;
exit;

The server, not the client, closes the connection. $string does not always contain the complete string.

Though I am not worthy, any ideas? Thanks for any insights.

evilstevel

Replies are listed 'Best First'.
Re: inetd server problem
by miyagawa (Chaplain) on Jul 24, 2001 at 18:41 UTC
    put

    $/ = undef;

    in top of the script. It will slurp the input.

    --
    Tatsuhiko Miyagawa
    miyagawa@cpan.org

Re: inetd server problem
by abstracts (Hermit) on Jul 24, 2001 at 22:33 UTC
    Hello,

    Your program reads data from STDIN. The line you mentioned "$string = <STDIN>;" works if your input is a single line. For multiline input, you need to devise a way to stop reading and start processing.

    There are many ways to do this:

    1. Put the entire input in one line:
      Example: Use
      Abdulaziz Ghuloum;;myemail@mycompany.com;;Subject Here
      instead of
      From: Abdulaziz Ghuloum
      Email: myemail@mycompany.com
      Subject: Subject Here
      
      This way, your code can easily extrace all message components. This method only works if the message is small and if you can always find a unique separator (";;" in the example I provided).

    2. Give the number of lines in the header, just like how http supplies Content-length header or email messages give the number of lines in the header.
      Your script should read the headers and check for the message length header and then, after reading the headers, reads in a loop until it reads the whole message. This is the recommended way for text or binary messages.

    3. Decide on a terminating sequence to finish reading and start processing. Usually this sequence is a blank line. The client sends a "\n" after sending every "line\n" and the server, after chomping the line, does "last unless length". This is the recommended method for text messages.
    Remember that simply reading from STDIN in a list context will cause your program to appear hanging as it blocks waiting for more input.

    Undefining $/ should cause you trouble as your program will read waiting for EOF which might not happen unless the client closes writing to the socket.

    Hope this helps,,,

    Aziz,,,