34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
(import srfi-18 pkts matchable regex
typed-records srfi-69 srfi-1
srfi-4 regex-case
(prefix sqlite3 sqlite3:)
foreign
tcp6
;; ulex-netutil
hostinfo)
;;======================================================================
;; KEY FUNCTIONS - THESE ARE TOO BE EXPOSED AND USED
;;======================================================================
;; connection setup and management functions
|
|
>
|
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
(import srfi-18 pkts matchable regex
typed-records srfi-69 srfi-1
srfi-4 regex-case
(prefix sqlite3 sqlite3:)
foreign
tcp6
;; ulex-netutil
hostinfo
)
;;======================================================================
;; KEY FUNCTIONS - THESE ARE TOO BE EXPOSED AND USED
;;======================================================================
;; connection setup and management functions
|
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
|
(define (send-ack udata host-port qrykey) ;; #!optional (hostname #f)(pid #f))
(send udata host-port "ack" qrykey qrykey)) ;; we must send a second line - for the ack let it be the qrykey
;;
;;
(define (ulex-handler udata)
(let* ((serv-listener (udat-serv-listener udata)))
(let-values (((inp oup)(tcp-accept serv-listener)))
;; data comes as two lines
;; handlerkey resp-addr:resp-port hostname pid qrykey [dbpath/dbfile.db]
;; data
(let loop ((state 'start))
(let* ((controldat (read-line inp))
(data (read-line inp)))
(match (string-split controldat)
((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)
(let* ((proc (hash-table-ref/default (udat-handlers udata) 'ping #f))
(val (if proc (proc) "gotping")))
(send udata host:port "version" qrykey val)))
((rucaptain)
(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))))
(else (print "BAD DATA? controldat=" controldat " 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))
;;======================================================================
|
|
|
|
|
|
>
>
>
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
|
(define (send-ack udata host-port qrykey) ;; #!optional (hostname #f)(pid #f))
(send udata host-port "ack" qrykey qrykey)) ;; we must send a second line - for the ack let it be the qrykey
;;
;;
(define (ulex-handler udata)
(let* ((serv-listener (udat-serv-listener udata)))
(print "serv-listner: " serv-listener)
;; data comes as two lines
;; handlerkey resp-addr:resp-port hostname pid qrykey [dbpath/dbfile.db]
;; data
(let loop ((state 'start))
(let-values (((inp oup)(tcp-accept serv-listener)))
(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)
(case (string->symbol handlerkey)
((ack)(print "Got ack!"))
((ping)
(close-input-port inp) ;;; these don't work
(close-output-port oup)
(let* ((proc (hash-table-ref/default (udat-handlers udata) 'ping #f))
(val (if proc (proc) "gotping")))
(send udata host:port "version" qrykey val)))
((rucaptain)
(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))))
(else (print "BAD DATA? controldat=" controldat " 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))
;;======================================================================
|