Главная страница
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.008 c
15-1401136202
Юрий
2014-05-27 00:30
2014.12.28
С днем рождения ! 27 мая 2014 вторник


11-1255812216
Ruzzz
2009-10-18 00:43
2014.12.28
Почему закомментирована строка TKOLOpenDirDialog


15-1400327678
Rouse_
2014-05-17 15:54
2014.12.28
Семейное MMP 24 мая 2014


15-1400561318
KilkennyCat
2014-05-20 08:48
2014.12.28
Требуется помощь. Типа мозгового штурма.


3-1296112876
TheEd
2011-01-27 10:21
2014.12.28
глюк или не глюк???