Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. def isReachableByEcho(ip: String, timeout: Int): Boolean = {
  2. Zone { implicit z =>
  3. val cIP = toCString(ip)
  4. var hints = stackalloc[addrinfo]
  5. var ret = z.alloc(sizeof[addrinfo]).cast[Ptr[addrinfo]]
  6.  
  7. string.memset(hints.cast[Ptr[Byte]], 0, sizeof[addrinfo])
  8. hints.ai_family = AF_UNSPEC
  9. hints.ai_protocol = 0
  10. hints.ai_addr = null
  11. hints.ai_flags = 4 // AI_NUMERICHOST
  12. hints.ai_socktype = SOCK_STREAM
  13. hints.ai_next = null
  14. ret.ai_next = null
  15.  
  16. if (getaddrinfo(cIP, toCString("7"), hints, ret) != 0) {
  17. return false
  18. }
  19.  
  20. val sock = socket(ret.ai_family, SOCK_STREAM, ret.ai_protocol);
  21. if (sock < 0) {
  22. freeaddrinfo(ret)
  23. return false
  24. }
  25. val connectRes = connect(sock, ret.ai_addr, ret.ai_addrlen)
  26. if (connectRes < 0) {
  27. close(sock)
  28. freeaddrinfo(ret)
  29. return false
  30. }
  31.  
  32. freeaddrinfo(ret)
  33.  
  34. val sentBytes = send(sock, toCString("echo"), 4, 0)
  35. if (sentBytes < 4) {
  36. close(sock)
  37. return false
  38. }
  39.  
  40. val rfds = stackalloc[fd_set](FD_SETSIZE / sizeof[CInt])
  41. FD_ZERO(rfds)
  42. FD_SET(sock, rfds)
  43.  
  44. val time = stackalloc[timeval]
  45. time.tv_sec = timeout / 1000
  46. time.tv_usec = (timeout % 1000) * 1000
  47.  
  48. // name conflict
  49. var res =
  50. scalanative.posix.sys.select.select(sock + 1, rfds, null, null, time)
  51.  
  52. val buf = stackalloc[CChar](5)
  53. val recBytes = recv(sock, buf, 5, 0)
  54. if (recBytes < 4) {
  55. close(sock)
  56. return false
  57. }
  58.  
  59. close(sock)
  60. }
  61. true
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement