Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.12.28;
Скачать: CL | DM;

Вниз

Сервер. Сокеты, потоки.   Найти похожие ветки 

 
kernel ©   (2010-05-18 17:36) [10]

Всем привет! Чтобы не создавать отдельный топик, спрошу здесь (т.к. разговор связан с этой темой).

Организовал нужный мне функционал на базе TServerSocket (режим - stThreadBlocking) с созданием отдельных потоков для каждого установленного соединения. Дошел до момента, где мне необходимо делать туннелирование между [клиент] <-> ["прокси-сервер"] <-> [запрашиваемый сервер] для работы SSL. Механизм такой: клиент посылает мне запрос CONNECT (HTTP/1.0), затем после того, как я (прокси) отправляю заголовок "200 OK - соединение установлено", в цикле, пока любое из двух соединений не разорвется (клиент или TargetHost), ловлю данные в буфер от клиента и тут же передаю запрашиваемому серверу, пока от клиента не начнет приходить ноль байт. Затем то же самое делаю, но наоборот, ловлю данные в буфер от запрашиваемого сервера и тут же передаю клиенту. И это все повторяется до тех пор, пока кто-либо из них не разорвет соединение.

...
const BufSize = 128;
...
ClientStream : TWinSocketStream;
TargetConnection: TTcpClient;
Buf: array [0..BufSize-1] of Byte;
...
ClientStream := TWinSocketStream.Create(ClientSocket, 60000);
...
while (КлиентИПунктНазначенияПодключены) do begin
ClientWait := (ClientStream.WaitForData(100));
if ClientWait then begin
 RecLen := ClientStream.Read(Buf, BufSize);
 while (ClientSocket.Connected) and (TargetConnection.Connected) and (RecLen > 0) do begin
  TargetConnection.SendBuf(Buf, RecLen);
  if (not ClientSocket.Connected) or (not TargetConnection.Connected) then Break;
  if (not ClientStream.WaitForData(10)) then Break;
  RecLen := ClientStream.Read(Buf, BufSize);
 end;
end;

ServerWait := TargetConnection.WaitForData(100);
if ServerWait then begin
 RecLen := TargetConnection.ReceiveBuf(Buf, BufSize);
 while (ClientSocket.Connected) and TargetConnection.Connected) and (RecLen > 0) do begin
  ClientStream.Write(Buf, RecLen);
  if (not ClientSocket.Connected) or (not TargetConnection.Connected) then Break;
  if (not TargetConnection.WaitForData(10)) then Break;
  RecLen := TargetConnection.ReceiveBuf(Buf, BufSize);
 end;
end;
end;

...


Все бы хорошо (и даже отрабатываются несколько проходов общего цикла верно), но практически сразу общий цикл замирает (точнее, не замирает, а бесконечно крутится) и наблюдается странная картина: ClientStream.WaitForData(100) в начале цикла начинает все время возвращать True, в то время как количество принятых байт (RecLen := ClientStream.Read ...) с этого сокета становится все время равно нулю. При этом, оба соединения не дисконнэктятся (хотя с чего бы им разрываться, если данные "недопередались").

Вопрос: Что я делаю не так? :)



Страницы: 1 вся ветка

Текущий архив: 2014.12.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.005 c
15-1396545086
Павиа
2014-04-03 21:11
2014.12.28
Выбор ноутбука


15-1401136202
Юрий
2014-05-27 00:30
2014.12.28
С днем рождения ! 27 мая 2014 вторник


2-1386432858
Sulim4ik
2013-12-07 20:14
2014.12.28
Красно-черные деревья


15-1401363729
В поисках железяк
2014-05-29 15:42
2014.12.28
ИБП обязательно должен быть мощнее БП?


6-1273586835
kernel
2010-05-11 18:07
2014.12.28
Сервер. Сокеты, потоки.