PageRenderTime 56ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/scheme/net/big-socket.scm

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