У меня есть прокси-клиент между двумя серверами. Основной сервер S1 находится в Интернете. Прокси-клиент и второй сервер S2 находятся в одной и той же интрасети. У меня есть следующий код (детали опущены для простоты), который отвечает за пересылки данных, поступающих из S2 «как есть» на S1:socket send throws timeout error
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
, не успевая отправить данные. Что я могу сделать здесь? (Я тестирую попытку отправки файла 1 МБ, для небольших объемов данных эта проблема, похоже, не происходит.)