2013-04-17 3 views
5

मैं लुआ प्रोग्रामिंग भाषा का उपयोग कर एक सर्वर लिख रहा हूं, और नेटवर्क परत LuaSocket पर आधारित है।लुसकेट लाइब्रेरी में सॉकेट को कैसे बंद किया गया है या नहीं?

और मुझे किसी सॉकेट को बंद करने के लिए कोई तरीका नहीं मिला है या इसके संदर्भ मैनुअल में नहीं है, इसके अलावा केवल डेटा पढ़ने की कोशिश करें (यह कॉल करते समय शून्य और स्ट्रिंग 'क्लोज' लौटाएगा)।

मेरे कोड इस तरह दिखता है:

local socket = require 'socket' 
local server = socket.tcp() 
local port = 9527 

server:bind('*', port) 
local status, errorMessage = server:listen() 
if status == 1 then 
    printf('Server is launched successfully on port %u', port) 
else 
    printf('Server listen failed, error message is %s', errorMessage) 
    return 
end 

local sockets = {server} 

while true do 
    local results = socket.select(sockets) 
    for _, sock in ipairs(results) do 
     if sock == server then 
      local s = server:accept() 

      callback('Connected', s) 
      table.insert(sockets, s) 

      printf('%s connected', s:getsockname()) 
     else 
      -- trying to detect socket is closed 
      if sock:isClosed() then 
       callback('Disconnected', sock) 

       for i, s in ipairs(sockets) do 
        if s == sock then 
         table.remove(sockets, i) 
         break 
        end 
       end 

       printf('%s disconnected', sock:getsockname()) 
      else 
       callback('ReadyRead', sock) 
      end 
     end 
    end 
end 
+0

'सत्य' लूप के अंदर 'सर्वर: settimeout' कॉल करें। – hjpotter92

उत्तर

1

को छोड़कर बस से डेटा पढ़ने की कोशिश से (यह नहीं के बराबर और स्ट्रिंग 'बंद' जब कि बुला वापस आ जाएगी)।

मुझे किसी अन्य विधि से अवगत नहीं है। परिणाम आपके लिए सॉकेट काम पढ़ने से क्यों नहीं देख रहा है?

आपको कॉल को गैर-अवरुद्ध करने के लिए सेटटाउटआउट का उपयोग करने की आवश्यकता है और closed (close पर नहीं) के लिए लौटाई गई त्रुटि की जांच करें। आप एक बाइट पढ़ सकते हैं और इसे स्टोर कर सकते हैं या आप शून्य बाइट्स पढ़ने का प्रयास कर सकते हैं।

संबंधित मुद्दे