place-tcp-unit.rkt 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #lang racket/base
  2. (require net/tcp-sig
  3. (prefix-in tcp: racket/tcp)
  4. racket/unit)
  5. (provide
  6. make-place-tcp@)
  7. (struct place-tcp-listener (sema ch)
  8. #:property prop:evt (lambda (self)
  9. (handle-evt
  10. (place-tcp-listener-sema self)
  11. (lambda (_) self))))
  12. (define (make-place-tcp@ accept-ch)
  13. (unit
  14. (import)
  15. (export tcp^)
  16. (define (tcp-abandon-port p)
  17. (tcp:tcp-abandon-port p))
  18. (define (tcp-accept l)
  19. (apply values (channel-get (place-tcp-listener-ch l))))
  20. (define (tcp-accept/enable-break l)
  21. (apply values (sync/enable-break (place-tcp-listener-ch l))))
  22. (define (tcp-accept-ready? _l)
  23. (error 'tcp-accept-ready? "not supported"))
  24. (define (tcp-addresses _p [port-numbers? #f])
  25. (if port-numbers?
  26. (values "127.0.0.1" 1 "127.0.0.1" 0)
  27. (values "127.0.0.1" "127.0.0.1")))
  28. (define (tcp-close _l)
  29. (void))
  30. (define (tcp-connect _hostname
  31. _port-no
  32. [_local-hostname #f]
  33. [_local-port-no #f])
  34. (error 'tcp-connect "not supported"))
  35. (define (tcp-connect/enable-break _hostname
  36. _port-no
  37. [_local-hostname #f]
  38. [_local-port-no #f])
  39. (error 'tcp-connect/enable-break "not supported"))
  40. (define (tcp-listen _port-no
  41. [_backlog 4]
  42. [_reuse? #f]
  43. [_hostname #f])
  44. (define sema (make-semaphore))
  45. (define ch (make-channel))
  46. (thread
  47. (lambda ()
  48. (let loop ()
  49. (define data (channel-get accept-ch))
  50. (semaphore-post sema)
  51. (channel-put ch data)
  52. (loop))))
  53. (place-tcp-listener sema ch))
  54. (define (tcp-listener? l)
  55. (place-tcp-listener? l))))