Lupino

client.lua

Jul 17th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.84 KB | None | 0 0
  1. local internet = require("internet")
  2. local handle = internet.open("example.com", 18090)
  3. local computer = require("computer")
  4.  
  5. local maxMsgid = 65536
  6. local maxLength = 32767
  7.  
  8. function pack(msgid, data)
  9.     print('pack', msgid, data)
  10.     msgid = msgid % maxMsgid
  11.     local length = #data + 2
  12.     if length > maxLength then
  13.         print('payload is to large ignore.')
  14.         return
  15.     end
  16.  
  17.     local msg = ''
  18.  
  19.     msg = msg .. string.char(math.floor(length / 256))
  20.     msg = msg .. string.char(length % 256)
  21.     msg = msg .. string.char(math.floor(msgid / 256))
  22.     msg = msg .. string.char(msgid % 256)
  23.     msg = msg .. data
  24.  
  25.     return msg
  26. end
  27.  
  28. function unpack(msg)
  29.     print('unpack', #msg)
  30.     local length = string.byte(msg, 1) * 256 + string.byte(msg, 2)
  31.     local msgid = string.byte(msg, 3) * 256 + string.byte(msg, 4)
  32.     local data = msg:sub(5)
  33.  
  34.     return length, msgid, data
  35. end
  36.  
  37. function getLength(msg)
  38.     return string.byte(msg, 1) * 256 + string.byte(msg, 2)
  39. end
  40.  
  41. -- register computer address
  42. handle:write(pack(0, computer.address()))
  43.  
  44. while true do
  45.     local h = handle:read(2)
  46.     if #h == 2 then
  47.         local length = getLength(h)
  48.         if length > 2 and length < maxLength then
  49.             local msg = handle:read(length)
  50.             if #msg == length then
  51.                 local _, msgid, data = unpack(h + msg)
  52.                 local result, reason = pcall(function()
  53.                     local result, reason = load(data)
  54.                     if result then
  55.                         handle:write(pack(msgid, result()))
  56.                     else
  57.                         handle:write(pack(msgid, reason))
  58.                     end
  59.                 end)
  60.                 if not result then
  61.                     handle:write(pack(msgid, reason))
  62.                 end
  63.             end
  64.         end
  65.     end
  66. end
Advertisement
Add Comment
Please, Sign In to add comment