Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2014.12.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.002 c
2-1386291292
Alex80
2013-12-06 04:54
2014.12.28
Строка фиксированной ширины с помощью Format


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


4-1270795936
Рацелий
2010-04-09 10:52
2014.12.28
Перехват текущей папки||Вызов vista balloon


15-1396545086
Павиа
2014-04-03 21:11
2014.12.28
Выбор ноутбука


15-1400963402
Юрий
2014-05-25 00:30
2014.12.28
С днем рождения ! 25 мая 2014 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский