#!/usr/local/bin/pike// -*- mode: pike -*-
// $Id: echo.pike,v 1.2 2001/01/03 12:12:52 doug Exp $
// http://www.bagley.org/~doug/shootout/
// based on code from: Per Hedbor

#define DATA "Hello there sailor\n"

void echo_server(Stdio.Port p, int n) {
    Stdio.File f = p->accept();
    int tbytes;
    string q;
    while( (q = f->read( 8192,1  )) && strlen( q ) ) {
    tbytes += strlen(q);
    f->write( q );
    }
    write( "server processed %d bytes\n", tbytes );
}

void echo_client(int p, int n) {
    int i;
    Stdio.File f = Stdio.File();

    f->connect( "localhost", p );
    int s = strlen(DATA);
    for (i=0; i<n; i++) {
    f->write( DATA );
    if(  f->read( s ) != DATA ) {
        werror( "Transfer error at repetition "+i+"\n");
        _exit( 1 );
    }
    }
    f->close();
    _exit( 0 );
}

/* Fork is not really available in a threaded pike. Thus this hack. It
 * assumes the pike binary can be found in your path, and that you have
 * a /usr/bin/env
 */
void start_client( int p, int n )
{
    Process.create_process( ({ "e:/pike/7.2.239/bin/pike.exe", __FILE__,
                   (string)p, (string)n }) );
}

void main(int argc, array argv)
{
    if( argc < 3 )
    {
    int n = max((int)argv[-1],1);
    Stdio.Port p = Stdio.Port( 0 );
    int pno = (int)((p->query_address( )/" ")[1]);
    start_client( pno, n );
    echo_server( p, n );
    } else {
    echo_client( (int)argv[1], (int)argv[2] );
    }
    sleep(1);
}