2013-05-10 43 views
0

我有兩臺服務器之間的代理客戶端。主服務器S1在互聯網上。代理客戶端和第二個服務器S2位於同一個Intranet中。我有以下代碼(部分留出來爲簡單起見),這是負責轉發數據從S2未來「是」以S1:套接字發送拋出超時錯誤

fsctimeout = 0.01 

function send_data(sock, data, i, l) 
    local p,err,q = sock:send(data, i, l) 
    if(err == "timeout" and q ~= l) then 
     fsctimeout = fsctimeout * 2 
     sock:settimeout(fsctimeout) 
     send_data(sock, data, q + 1, l) 
     fsctimeout = fsctimeout/2 
     sock:settimeout(fsctimeout) 
    end 
end 

while not e do 

rect, _, st = socket.select({csc, fsc}, nil, .01) --csc is S1, fsc is S2 sockets. 

    if(rect[fsc] ~= nil and csc ~= nil) then 
     local data, err, part = fsc:receive(8192) 
     if(data ~= nil) then 
      send_data(csc, data, 1, data:len()) 
      totalBytesFromFP = totalBytesFromFP + data:len() 
     end 
     if(part ~= nil) then 
      send_data(csc, part, 1, part:len()) 
      totalBytesFromFP = totalBytesFromFP + part:len() 
     end 
    end 
end 

我寫的send_data功能,因此,如果發送超時,這將增加一倍套接字超時並重試。但是現在有時候這些程序會被卡在send_data函數中而沒有成功發送數據。我能在這裏做什麼? (我正在測試試圖發送一個1MB文件,對於少量數據,這個問題似乎並沒有發生。)

回答

0

只有在得到「超時」錯誤後,才更改第一次超時,但它永遠不會發生,因爲默認send是阻止(所以它永遠不會超時)。

只需在循環之前添加csc:settimeout(fsctimeout)即可。