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

Вниз

TWSocket пул сокетов   Найти похожие ветки 

 
mnm   (2006-08-02 17:38) [0]

Интересует, как необходимо правильно организовывать клиентское много-поточное приложение (потоков до тысячи допустим), не хочу применять потоки-Threads, хочется сделать пул сокетов. Читал про подобное при конструировании сервера на чистом winsock"ете, с использованием пула сокетов.

Вот и хотелось бы узнать, реально ли организовать клиентское приложение на TWSocket с пулом сокетов, вместо виндовских потоков. Я себе лично не предстваляю, поэтому интересуюсь вашего мнения...


 
DiamondShark ©   (2006-08-02 18:00) [1]

Что-то мне кажется, здесь каша понятий какая-то...

Зачем клиентскому приложению такое количество потоков?

Что такое пул сокетов? Сокеты -- "одноразовые" объекты, после отключения их можно только уничтожить. Значит, фактически, пул подключений? Откуда такое количество подключений? Почему пул подключений противопоставляется использованию потоков?

Странное какое-то приложение...
Или терминология от общепринятой отличается.


 
имя   (2006-08-02 18:39) [2]

Удалено модератором


 
mnm   (2006-08-02 19:21) [3]

Ну первым делом, скажу, чтоя  правда запутался в терменах. В итоге, сейчас постараюсь переформулировать.

Как организовать многопоточность (я не говорю про именно многопоточность по tthread / createthread, просто употребляю этот термин как одновременное кол-во объектов работающих с сетью), не прибегая к использованию встроенной в винду потоковой (createthread / tthread - delphi) технологии, на TWSocket.

Пример, где я напрмер встетил похожую реализацию но на чистом winsockete. http://delphiworld.narod.ru/base/sockets3.html

До 1000 потоков, я сказал по максимуму, ну вот допустим представляете есть у вас скажем список ip адресов (много, несколько тысяч...) , необходимо их проверить на пригодность для использования в качестве прокси. Я конечно учитываю, что и канал очень-хороший и оборудование тоже. Вот в таком случае и можно применить потоков 500. Ну это я же опять всё для примера привел.

Блин, опять наверное все ещё больше запутал....


 
mnm   (2006-08-02 19:58) [4]

Вот к примеру, если меня не поняли, ещё одно упоминание о моей идеи вот тут http://www.xakep.ru/post/14087/default.asp


 
Сергей М. ©   (2006-08-03 08:20) [5]


> mnm


Ты так и не сказал, зачем тебе понадобились потоки, да еще в таком количестве.
Создай нужное число клиентских гнезд, переведи их в неблококирующий режим и работай с ними в одном и том же потоке..


 
Rouse_ ©   (2006-08-03 11:23) [6]

Боюсь что select не потянет сразу 500 гнезд :)


 
Сергей М. ©   (2006-08-03 11:29) [7]

А и не надо select)

На то, сам понимаешь, есть WSAAsyncSelect/WSAEventSelect

Правда, в случае с WSAEventSelect засада будет в другом месте - придется разруливать ситуацию с системным ограничением кол-ва ивентов, передаваемых на вход wait-функций


 
Rouse_ ©   (2006-08-03 11:38) [8]

Я кстати тоже про WSAAsyncSelect подумал, надо будет на досуге поэксперементировать, сколько он сможет выдержать :)


 
Сергей М. ©   (2006-08-03 11:44) [9]


> Rouse_ ©   (03.08.06 11:38) [8]


А ему не надо ничего держать)
Он же просто переводит указанное гнездо в неблок.режим с оконными нотификациями, т.е. говорит одному конкретному гнезду, мол, отныне при таких-то транспортных событиях посылай такое-то сообщение такому-то окну.


 
Rouse_ ©   (2006-08-03 11:45) [10]

Ну да :) Я в плане системных ограничений :)


 
Сергей М. ©   (2006-08-03 11:57) [11]

Ну у каждой системы они свои ..
Здесь следует больше волноваться за то, сколько гнезд при этом может существовать одновременно. Гнездо же, по сути, представлено в памяти некой внутренней структурой, с которой ассоциирован хэндл этого гнезда. А память она не резиновая).. Кр.того, ограничены иные ресурсы как процесса, так и системы в целом..


 
mnm   (2006-08-03 12:31) [12]

Спасибо, что поняли мою идею :) Ну на голом winsocket"e я уже немного представляю как такое реализовать, но вопрос мой про реализацию этой же идеи, но с помощью TWSocket (ICS, www.overbyte.be/eng/products/ics.html). Есть идеи? Я просто не очень предстаялю как с ним такое осуществить.


 
Сергей М. ©   (2006-08-03 12:44) [13]

А чем стандартные TClientSocket и TTCPClient не угодили ?


 
mnm   (2006-08-03 12:56) [14]

Ну а если можно с ним (TClientSocket и TTCPClient), пример небольшой привести. Я не понимаю, как использовать компонент/класс в моей идеи. Т.е. при использовании чистого TSocket, всё более менее чуть-чуть внятно. Что делать в случае с TClientSocket и TTCPClient, я хоть убейте за мою тупость не пойму?


 
Сергей М. ©   (2006-08-03 13:19) [15]

type

TMyForm = class(TForm)
..
 ClientSockets: array[0..499] of TClientSocket;
..
 procedure DoRead(Sender: TObject; Socket: TCustomWinSocket);
 procedure DoWrite(Sender: TObject; Socket: TCustomWinSocket);
 procedure DoConnect(Sender: TObject; Socket: TCustomWinSocket);
 procedure DoError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer)
..
end;

..

for i:= 0 to 499 do begin
ClientSockets[i] := TClientSocket.Create(Self);
with ClientSockets[i] do begin
    Tag := i;
    Address := ...; //нужный IP-адрес
    Port := ...; //нужный порт
    OnConnect := DoConnect;
    OnRead := DoRead;
    OnWrite := DoWrite;
    OnError := DoError;
    Open;
end;
end;

....
procedure TMyForm.DoRead(Sender: TObject; Socket: TCustomWinSocket);
begin
... здесь читаешь анализируешь данные, поступающие от сервера ..
... по окончанию анализа делаешь Socket.Close, далее см. (*)
end;

procedure TMyForm.DoWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
... если есть не переданные серверу данные, передаешь их здесь...
end;

procedure TMyForm.DoConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  ... коннект с сервером установлен ...
end;

procedure TMyForm.DoError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer)
begin
  ErrorCode := 0;
  Socket.Close;
... здесь устанавливаешь, если необходимо, другой адрес и другой порт (*):
  with ClientSockets[TComponent[Sender].Tag] do begin
     Address := ....;
     Port := ....;
     Open; //старт операции коннекта
  end;
 
end;


 
mnm   (2006-08-03 13:28) [16]

Сергей М., спасибо большое, я так и думал приблизительно, только сомневался в правильности и надежности при большом количестве объектов в массиве. Сейчас посмотрел TTCPCLient, обнаружил в нем BlockMode, то бишь возможность использования блокирующего/не блокирующего режима и не пойму сейчас, а какое поведение будет у такого массива, при использовании блокирующего или не блокирующего? Я понимаю разницу между блокирующем и не блокирующим, но как тут это будет отражаться -- не понимаю.


 
Сергей М. ©   (2006-08-03 13:41) [17]


> mnm   (03.08.06 13:28) [16]


TClientSocket тоже умеет работать в блок. и неблок. режимах, причем по-умолчанию в момент создания объекта устанавливается как раз неблок.режим.

TTCPCLient в неблок.режиме, пожалуй, даже более удачным решением будет - там событийный механиз получше продуман, да и методы SendLn()/ReceiveLn() по их внутренней логике будут более подходящими для простого обмена строками текста с HTTP-прокси-сервером.

Блокирующий же режим не годится по условию - для этого придется создавать доп.потоки, что нежелательно и вряд ли оправдано в решении данной задачи.


> какое поведение будет у такого массива


У массива нет и не может быть "поведения", он просто хранит ссылки на созданные сокетные объекты для их последующего уничтожения и быстрого доступа к конкретным объектам по их индексу в массиве.

Обработчики событий для всех объектов в массиве единые и устанавливаются однократно сразу после создания объектов.


 
Сергей М. ©   (2006-08-03 14:02) [18]


> mnm


Наверно, еще одним не худшим решением будет использовать (в кач-ве альтернативы TClientSocket и TTCPClient) компонент TApdWinsockPort в составе TurboPower AsyncPro. Если мне не изменяет память, там тоже реализован неблок.режим, к тому же имеются св-ва/методы/события, ощутимо упрощающие обмен по прикладному протоколу инф.обмена с партнером.



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

Форум: "Сети";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.045 c
2-1165200839
M1sT
2006-12-04 05:53
2006.12.24
Перемещение записи


2-1165553803
Алексей С.
2006-12-08 07:56
2006.12.24
Удаление Run-Time элементов управления


2-1164702053
Mishenka
2006-11-28 11:20
2006.12.24
Повторный запуск программы


15-1164825961
Kostafey
2006-11-29 21:46
2006.12.24
Какой клиент форума лучше.


11-1130485465
nester
2005-10-28 11:44
2006.12.24
Как в EditBox заменить символ для ввода пароля?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский