PageRenderTime 60ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/scheme/net/big-socket.scm

https://bitbucket.org/wnoble/s48
Scheme | 81 lines | 51 code | 15 blank | 15 comment | 0 complexity | 747f8051b9b93635993d36ea7914e377 MD5 | raw file
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Mike Sperber
  3. ; Emulation of old socket interface.
  4. ; Server interface
  5. ; (open-socket [socket-number]) -> socket
  6. ; (close-socket socket)
  7. ; (socket-accept socket) -> [input-port output-port]
  8. ; (get-host-name) -> string
  9. ; (socket-port-number socket) -> integer
  10. ; Client interface
  11. ; (socket-client host-name socket-number) -> [input-port output-port]
  12. (define open-socket
  13. (opt-lambda ((port 0))
  14. (let ((sock (make-socket (address-family inet) (socket-type stream))))
  15. (set-socket-reuse-address?! sock #t)
  16. (bind-socket sock (make-ipv4-socket-address (ipv4-address-any) port))
  17. (socket-listen sock)
  18. sock)))
  19. (define (socket-port-number sock)
  20. (socket-address-ipv4-port (socket-address sock)))
  21. (define (socket-client host-name port)
  22. (let* ((ai
  23. (car
  24. (get-address-info host-name #f
  25. (address-info-flags) (address-family inet)
  26. (socket-type stream))))
  27. (sa (address-info-socket-address ai))
  28. (address (socket-address-ipv4-address sa))
  29. (socket (make-socket (address-family inet)
  30. (socket-type stream))))
  31. (socket-connect socket
  32. (make-ipv4-socket-address address port))
  33. (values (socket-input-port socket)
  34. (socket-output-port socket))))
  35. (define (socket-accept socket)
  36. (call-with-values
  37. (lambda () (net:socket-accept socket))
  38. (lambda (newsock address)
  39. (values (socket-input-port newsock)
  40. (socket-output-port newsock)))))
  41. ; UDP sockets
  42. ; Open a UDP socket, returning the two sides. If a socket port is specified
  43. ; it is given to the input half.
  44. (define open-udp-socket
  45. (opt-lambda ((port 0))
  46. (let ((sock (make-socket (address-family inet) (socket-type dgram))))
  47. (set-socket-reuse-address?! sock #t)
  48. (bind-socket sock (make-ipv4-socket-address (ipv4-address-any) port))
  49. (values sock (dup-socket sock)))))
  50. (define (udp-send socket address buffer count)
  51. (socket-send socket buffer 0 count address))
  52. (define (udp-receive socket buffer)
  53. (socket-receive socket buffer))
  54. (define udp-address? ipv4-socket-address?)
  55. (define udp-address-address socket-address-ipv4-address)
  56. (define udp-address-port socket-address-ipv4-port)
  57. ;; The old code would cache these addresses.
  58. (define (lookup-udp-address host-name port)
  59. (let* ((sa
  60. (address-info-socket-address
  61. (car
  62. (get-address-info host-name #f
  63. (address-info-flags) (address-family inet)
  64. (socket-type dgram)))))
  65. (inet (socket-address-ipv4-address sa)))
  66. (make-ipv4-socket-address inet port)))