Index: ulex/ulex.scm ================================================================== --- ulex/ulex.scm +++ ulex/ulex.scm @@ -55,10 +55,12 @@ ;; (define (setup) (let* ((udata (make-udat)) (cpkts (get-all-captain-pkts udata)) ;; read captain pkts (captn (get-winning-pkt cpkts))) + ;; check to see if our own server is started and start one if not + (if (not (udat-serv-listener udata))(start-server-find-port udata)) (if captn (let* ((port (alist-ref 'port captn)) (host (alist-ref 'host captn)) (ipaddr (alist-ref 'ipaddr captn)) (pid (alist-ref 'pid captn)) @@ -82,11 +84,11 @@ (define (connect udata dbfname dbtype) udata) (define (ping udata host-port) (let* ((cookie (make-cookie udata)) - (res (send-receive udata host-port 'ping "just pinging" (conc (current-seconds)) timeout: 1))) + (res (send udata host-port 'ping cookie (conc (current-seconds)) retval: #t))) ;; (print "got res=" res) (equal? res cookie) )) ;;====================================================================== @@ -341,28 +343,41 @@ ;; send structured data to recipient ;; ;; NOTE: qrykey is what was called the "cookie" previously ;; -(define (send udata host-port handler qrykey data #!key (hostname #f)(pid #f)(params '())) +;; retval tells send to expect and wait for return data (one line) and return it or time out +;; this is for ping where we don't want to necessarily have set up our own server yet. +;; +(define (send udata host-port handler qrykey data #!key (hostname #f)(pid #f)(params '())(retval #f)) (let-values (((inp oup)(get-peer-ports udata host-port hostname pid))) + ;; CONTROL LINE: (note: removed the hostname - I don't think it adds much value ;; ;; handlerkey host:port pid qrykey params ... ;; (if (and inp oup) - (begin - (write-line (conc + (let* ((myhost (udat-my-address udata)) + (myport (udat-my-port udata)) + (dat (conc handler " " (udat-my-address udata) ":" (udat-my-port udata) " " ;; (udat-my-hostname udata) " " (udat-my-pid udata) " " qrykey - (if (null? params) "" (conc " " (string-intersperse params " ")))) - oup) - (write-line data oup) - #t + (if (null? params) "" (conc " " (string-intersperse params " ")))))) + (if (and myhost myport) + (begin + (write-line dat oup) + (write-line data oup) + ;; (print "Sent dat: " dat " data: " data) + (if retval + (read-line inp) + #t)) + (begin + (print "ERROR: send called but no receiver has been setup. Please call setup first!") + #f)) ;; NOTE: DO NOT BE TEMPTED TO LOOK AT ANY DATA ON INP HERE! ;; (there is a listener for handling that) ) #f))) ;; #f means failed to connect and send @@ -424,27 +439,30 @@ (print "got here: inp=" inp " oup=" oup) (let* ((controldat (read-line inp)) (data (read-line inp))) (print "controldat: " controldat " data: " data) (match (string-split controldat) - ((handlerkey host:port pid qrykey params ...) - (print "handlerkey: " handlerkey " host:port: " host:port " pid: " pid " qrykey: " qrykey " params: " params) + ((handlerkey host-port pid qrykey params ...) + (print "handlerkey: " handlerkey " host-port: " host-port " pid: " pid " qrykey: " qrykey " params: " params) (case (string->symbol handlerkey) ((ack)(print "Got ack!")) - ((ping) - (close-input-port inp) ;;; these don't work - (close-output-port oup) + ((ping) ;; special case - return result immediately on the same connection (let* ((proc (hash-table-ref/default (udat-handlers udata) 'ping #f)) (val (if proc (proc) "gotping"))) - (send udata host:port "version" qrykey val))) + (write-line qrykey oup) + #;(send udata host-port "version" qrykey val) + ) + (close-input-port inp) + (close-output-port oup) + ) ((rucaptain) - (send udata host:port "iamcaptain" qrykey (if (udat-my-cpkt-key udata) + (send udata host-port "iamcaptain" qrykey (if (udat-my-cpkt-key udata) "yes" "no"))) (else - ;; (send-ack udata host:port qrykey) - (add-to-work-queue udata (get-peer-dat udata host:port) handlerkey qrykey data)))) + ;; (send-ack udata host-port qrykey) + (add-to-work-queue udata (get-peer-dat udata host-port) handlerkey qrykey data)))) (else (print "BAD DATA? controldat=" controldat " data=" data))))) (loop state)))) ;; add a proc to the handler list (define (register-handler udata key proc)