[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[shootout] echo.scm + Question concerning the implementation of thread



Here is a go at the echo server.
I have used threads although the guide lines tell you to avoid them;
fork was no where in the documentation (and frankly I like threads better).
The main reason for avoiding threads is the the timing is easier if
the programs only run in one thread on the host OS. The documentation
of  threads in mzscheme states that the implementation depends on the
platform.
Does that mean that mzscheme use a single thread on Windows and mulitple
under
Linux?

/Jens Axel Søgaard

Guide lines
-----------

    Each test program runs a single-threaded server process that listens on
an Internet
    socket. When the server starts, it forks a separate client process that
connects back
    to the server's socket. Then the server loops, receiving data and
echoing it back to
    the client until the client closes its socket. When it is finished, the
server reports how
    many bytes were processed. The client checks each echo request sent
against the data
     received from the server to make sure it is correct before the next
request is made.
    Each echo request consists of 19 characters including a terminating
newline.
    Each client must do the following for N iterations:

   send 19 bytes
   recv 19 bytes
   check reply == request
   repeat

    The read/write operations on the stream socket should either use
line-oriented standard I/O functions or else handle incomplete reads/writes.
    The reason for using fork is simply to make it easy for the test driver,
so it only has to start one process.


; @echo off
; mzscheme.exe -f echo.bat -mvC %1
; goto :end

(define PORT 8888)
(define DATA "Hello there sailor\n")
(define n 10)

(define (server)
  (thread client)
  (let-values ([(in out) (tcp-accept (tcp-listen PORT))])
    (let loop ([i (read in)]
               [bytes 0])
      (if (not (eof-object? i))
          (begin
            (write i out)
            (loop (read in)
                  (+ bytes (string-length i))))
          (begin
            (display "server processed ")
            (display bytes)
            (display " bytes\n"))))))

(define (client)
  (let-values ([(in out) (tcp-connect "127.0.0.1" PORT)])
    (let loop ([n n])
      (if (> n 0)
          (begin
            (write DATA out)
            (let ([i (read in)])
              (begin
                (if (equal? DATA i)
                    (loop (- n 1))
                    'error))))
          (close-output-port out)))))

(define (main args)
  (set! n (string->number (car  args)))
  (server))

; :end