2013-05-10 4 views
0

У меня есть прокси-клиент между двумя серверами. Основной сервер 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 МБ, для небольших объемов данных эта проблема, похоже, не происходит.)

ответ

0

Вы меняете тайм-аут в первый раз только после получения ошибки «тайм-аут», но это никогда происходит потому, что по умолчанию send блокирует (так что он никогда не истечет время ожидания).

Просто добавьте csc:settimeout(fsctimeout) перед вашей петлей.