#!/usr/local/bin/guile -s !# ;;; $Id: echo.guile,v 1.3 2001/06/29 23:12:36 doug Exp $ ;;; http://www.bagley.org/~doug/shootout/ ;;; from Brad Knotwell (use-modules (ice-9 format)) (define DATA "Hello there sailor\n") (define bufferSize (string-length DATA)) (define (echo-client n port-number) (let ((new-sock (socket AF_INET SOCK_STREAM 0)) (buf (make-string bufferSize))) (begin (connect new-sock AF_INET INADDR_LOOPBACK port-number) (do ((i 0 (1+ i))) ((= i n) (close new-sock)) (begin (send new-sock DATA) (recv! new-sock buf) (if (not (string=? buf DATA)) (throw 'badData))))))) (define (echo-server n) (let ((sock (socket AF_INET SOCK_STREAM 0))) (begin (setsockopt sock SOL_SOCKET SO_REUSEADDR 1) (bind sock AF_INET INADDR_LOOPBACK 0) (listen sock 2) (let ((pid (primitive-fork))) (if (= pid 0) (echo-client n (array-ref (getsockname sock) 2)) (let ((new-sock (car (accept sock))) (buf (make-string bufferSize)) (num-read 0)) (do ((i (recv! new-sock buf) (recv! new-sock buf))) ((= 0 i) (begin (waitpid pid WNOHANG) (display (format "server processed ~D bytes\n" num-read)))) (send new-sock buf) (set! num-read (+ num-read i))))))))) (echo-server (or (and (= (length args) 2) (string->number (cadr args))) 1))