Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def isReachableByEcho(ip: String, timeout: Int): Boolean = {
- Zone { implicit z =>
- val cIP = toCString(ip)
- var hints = stackalloc[addrinfo]
- var ret = z.alloc(sizeof[addrinfo]).cast[Ptr[addrinfo]]
- string.memset(hints.cast[Ptr[Byte]], 0, sizeof[addrinfo])
- hints.ai_family = AF_UNSPEC
- hints.ai_protocol = 0
- hints.ai_addr = null
- hints.ai_flags = 4 // AI_NUMERICHOST
- hints.ai_socktype = SOCK_STREAM
- hints.ai_next = null
- ret.ai_next = null
- if (getaddrinfo(cIP, toCString("7"), hints, ret) != 0) {
- return false
- }
- val sock = socket(ret.ai_family, SOCK_STREAM, ret.ai_protocol);
- if (sock < 0) {
- freeaddrinfo(ret)
- return false
- }
- val connectRes = connect(sock, ret.ai_addr, ret.ai_addrlen)
- if (connectRes < 0) {
- close(sock)
- freeaddrinfo(ret)
- return false
- }
- freeaddrinfo(ret)
- val sentBytes = send(sock, toCString("echo"), 4, 0)
- if (sentBytes < 4) {
- close(sock)
- return false
- }
- val rfds = stackalloc[fd_set](FD_SETSIZE / sizeof[CInt])
- FD_ZERO(rfds)
- FD_SET(sock, rfds)
- val time = stackalloc[timeval]
- time.tv_sec = timeout / 1000
- time.tv_usec = (timeout % 1000) * 1000
- // name conflict
- var res =
- scalanative.posix.sys.select.select(sock + 1, rfds, null, null, time)
- val buf = stackalloc[CChar](5)
- val recBytes = recv(sock, buf, 5, 0)
- if (recBytes < 4) {
- close(sock)
- return false
- }
- close(sock)
- }
- true
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement