Megatest

Diff
Login

Differences From Artifact [d39aeae93d]:

To Artifact [63bf7783f2]:


112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  (my-cpkt-key     #f)   ;; put Z card here when I create a pkt for myself as captain
  (my-address      #f)
  (my-hostname     #f)
  (my-port         #f)
  (my-pid          (current-process-id))
  (serv-listener   #f)
  (handler-thread  #f)
  (handlers        '())
  (outgoing-conns  (make-hash-table))  ;; host:port -> conn
  )

;; struct for keeping track of others we are talking to

(defstruct peer
  (addr-port       #f)







|







112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  (my-cpkt-key     #f)   ;; put Z card here when I create a pkt for myself as captain
  (my-address      #f)
  (my-hostname     #f)
  (my-port         #f)
  (my-pid          (current-process-id))
  (serv-listener   #f)
  (handler-thread  #f)
  (handlers        (make-hash-table))
  (outgoing-conns  (make-hash-table))  ;; host:port -> conn
  )

;; struct for keeping track of others we are talking to

(defstruct peer
  (addr-port       #f)
241
242
243
244
245
246
247
248

249
250
251
252
253
254
255
		     npdat))))
    pdat))

(define (get-peer-ports udata host-port #!optional (hostname #f)(pid #f))
  (let ((pdat (get-peer-dat udata host-port hostname pid)))
    (values (peer-inp pdat)(peer-oup pdat))))

;; send back ack

;;
(define (reply udata host-port handler qrykey data #!optional (hostname #f)(pid #f))
  (let-values (((inp oup)(get-peer-ports udata host-port hostname pid)))
    (write-line (conc
		 handler " "
		 (udat-my-address  udata) ":" (udat-my-port udata) " "
		 (udat-my-hostname udata) " "







|
>







241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
		     npdat))))
    pdat))

(define (get-peer-ports udata host-port #!optional (hostname #f)(pid #f))
  (let ((pdat (get-peer-dat udata host-port hostname pid)))
    (values (peer-inp pdat)(peer-oup pdat))))

;; send back ack, amusing I suppose that this looks almost like what
;; tcp itself does ...
;;
(define (reply udata host-port handler qrykey data #!optional (hostname #f)(pid #f))
  (let-values (((inp oup)(get-peer-ports udata host-port hostname pid)))
    (write-line (conc
		 handler " "
		 (udat-my-address  udata) ":" (udat-my-port udata) " "
		 (udat-my-hostname udata) " "
277
278
279
280
281
282
283




284
285
286
287
288
289
290
291
292
293




294
295
296
297
298
299
300
      (let loop ((state 'start))
	(let* ((controldat (read-line inp))
	       (data       (read-line inp)))
	  (match (string-split controldat)
	    ((handlerkey host:port hostname pid qrykey params ...)
	     (case (string->symbol handlerkey)
	       ((ack)(print "Got ack!"))




	       ((rucaptain)
		(reply udata host:port "iamcaptain" qrykey (if (udat-my-cpkt-key udata)
							       "yes"
							       "no")))
	       (else
		(send-ack udata host:port qrykey hostname pid)
		(add-to-work-queue udata (get-peer-dat udata host:port) handlerkey data)))
	     (else (print "BAD DATA? handler=" handlerkey " data=" data)))))
	(loop state)))))





;;======================================================================
;; connection setup and management functions
;;======================================================================

;; find or become the captain, return a ulex object
;;
(define (setup)







>
>
>
>










>
>
>
>







278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
      (let loop ((state 'start))
	(let* ((controldat (read-line inp))
	       (data       (read-line inp)))
	  (match (string-split controldat)
	    ((handlerkey host:port hostname pid qrykey params ...)
	     (case (string->symbol handlerkey)
	       ((ack)(print "Got ack!"))
	       ((ping)
		(let* ((proc (hash-table-ref/default (udat-handlers udata) 'ping #f))
		       (val  (if proc (proc) "gotping")))
		  (reply udata host:port "version" qrykey val)))
	       ((rucaptain)
		(reply udata host:port "iamcaptain" qrykey (if (udat-my-cpkt-key udata)
							       "yes"
							       "no")))
	       (else
		(send-ack udata host:port qrykey hostname pid)
		(add-to-work-queue udata (get-peer-dat udata host:port) handlerkey data)))
	     (else (print "BAD DATA? handler=" handlerkey " data=" data)))))
	(loop state)))))

;; add a proc to the handler list
(define (register-handler udata key proc)
  (hash-table-set! (udat-handlers udata) key proc))

;;======================================================================
;; connection setup and management functions
;;======================================================================

;; find or become the captain, return a ulex object
;;
(define (setup)