Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
 
 02:29 Geo
 
 
Во Флориде и в Королевстве сейчас  02:30[Войти] | [Зарегистрироваться]
Ответ на вопрос № 56098

14-10-2007 05:42
Не подскажете где можно почитать про создание многопользовательского сетевого сервера. Необходимо написать многопользовательский сервер, с которым будут работать несколько тысяч пользователей онлайн одновременно.
Направьте плиз в русло.. а то искал по нету, ничего не нашел :(
Хотябы самые азы...

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

17-12-2007 16:50 | Сообщение от автора вопроса
А каким образом можно высчитывать таймауты тогда ? =\ Ведь Select не вернет управление до тех пока указанное время не истечёт =\

16-12-2007 21:33
Самое время Вам вплотную познакомиться с протоколами TCP/IP и с их виндовой реинкарнацией.

Живут же люди - сотни и даже тысячи компьютеров под рукой имеют!
то, что мы затронули - самая верхушка айсберга, а на освоение остального необходимы время и практика.
 NS

16-12-2007 17:39 | Сообщение от автора вопроса
Разобрался (это насчет предыдущего поста). Но всеравно предел пользователей не как указано в MSDN 65 000 а всего около 33 000... В чем может быть фишка ?

16-12-2007 13:45
наткнулся на статью в инете http://support.microsoft.com/kb/q196271/ сделал все как написано. при нажатии на "папочку" Parameters в RegEdit'е справа появляются парметры DataBasePath, DeadGWDetectDefault, DhcpDomain,DhcpNameServer, Domain и другие. К ним я добавил MaxUserPort (REG_DWORD) = 0x00065000(413696). Всеравно останавливается на порту 5000 (смотрел при помощи netstat -a). не помогает... что делать, а ? =\

16-12-2007 13:02 | Сообщение от автора вопроса
Спасибо большое за помощь. Вот еще одна проблемка возникла. Тестил сервак и решил приконнектить к нему 50 000 клиентов одновременно. Примерно на 3900 клиенте он выдал следующее... ошибка WinSock при выполнении функции Connect ( к лиенте) WSAGetLasError = 10055 (WSAENOBUFS). не подскажете как этого избежать ?

16-12-2007 08:53
Я упустил? Ну ладно, я так я:)) Для запуска потока используется самая обыкновенная функция, никаких особых параметров не требуется. В том числе вполне годится и TThread.

>>> у меня хватает знаний чтобы все это понять и освоить
А я и не говорил, что Вы не сможете в этом разобраться. Вот только то, что мы затронули - самая верхушка айсберга, а на освоение остального необходимы время и практика. Только это я и имел в виду.
 NS

16-12-2007 06:40 | Сообщение от автора вопроса
Нет... у меня хватает знаний чтобы все это понять и освоить. Спасибо большое за разъяснения... А вот этот вопросик вы пропустили. При создании потока надо указывать процедуру в которой все это будет выполняться... данная процедура(функция) должна иметь какие-то специфические параметры для передачи в неё? Или просто обычная процедура ?


procedure MyProc;
var
  ....
begin
  ....
end;


16-12-2007 01:14
Я вот чего подумал - может Вам лучше использовать QueueUserWorkItem? Она, правда, использует некий усредненный алгоритм, который в большинстве случаев не обеспечивает максимальную загрузку процессоров, зато освобождает программиста от всех забот по управлению пулом, перекладывая их на систему.
 NS

15-12-2007 23:01
>>>необходимо будет всеравно создать около 1000 потоков
Да что у Вас за гигантизм, ей-богу:(( Изначально рекомендуется подключать потоков в два раза больше, чем имеется процессоров. А далее нужно следить, если входная очередь непуста, а процессоры загружены не полностью, то можно добавить 1-2 потока и опять следить. А при полной нагрузке от добавления потоков только хуже будет.

Вы уверены, что не рановато взялись за задачу такого уровня?
 NS

15-12-2007 22:49
unit CompletionPort;

{$I CompVersionDef.inc}

interface

uses
  Windows;

type
  POverlappedEx = ^TOverlappedEx;
  TOverlappedEx = record
    Ovp: TOverlapped;
    Obj: Pointer;
  end;

  TCompletionPort = class
  private
    FMaxActiveThreads: Cardinal;
    FHandle: THandle;
  public
    constructor Create(MaxActiveThreads: Cardinal = 0);
    destructor Destroy;override;

    function AddDevice(hDevice: THandle; CompletionKey: Cardinal): boolean;
    function FreeDevice(hDevice: THandle): boolean;
    function WaitCompletion(out NumBytes, CompKey: Cardinal;
              out pOvp: POverlappedEx; TimeOut: Cardinal = INFINITE): boolean;
    function SetCompletion(NumBytes, CompKey: Cardinal;
      const Ovp: TOverlappedEx): boolean;
    property Handle: THandle read FHandle;
    property MaxActiveThreads: Cardinal read FMaxActiveThreads;
  end;

implementation

uses
  SysUtils;

{ TCompletionPort }

constructor TCompletionPort.Create(MaxActiveThreads: Cardinal);
begin
  FMaxActiveThreads:= MaxActiveThreads;
  FHandle:= CreateIoCompletionPort(INVALID_HANDLE_VALUE,
              0 , 0, FMaxActiveThreads);
{$IFDEF VER140__}
  if FHandle = 0 then RaiseLastOsError;
{$ELSE}
  if FHandle = 0 then RaiseLastWin32Error;
{$ENDIF}
end;

function TCompletionPort.AddDevice(hDevice: THandle;
  CompletionKey: Cardinal): boolean;
begin
  Result:= CreateIoCompletionPort(hDevice, Handle, CompletionKey, 0) = FHandle;
end;

destructor TCompletionPort.Destroy;
begin
  if FHandle <> 0 then CloseHandle(FHandle);
  inherited;
end;

function TCompletionPort.FreeDevice(hDevice: THandle): boolean;
begin
  Result:= CloseHandle(hDevice);
end;

function TCompletionPort.SetCompletion(NumBytes, CompKey: Cardinal;
  const Ovp: TOverlappedEx): boolean;
begin
  Result:= PostQueuedCompletionStatus(Handle, NumBytes, CompKey, @Ovp.Ovp);
end;

function TCompletionPort.WaitCompletion(out NumBytes, CompKey: Cardinal;
  out pOvp: POverlappedEx; TimeOut: Cardinal = INFINITE): boolean;
begin
  Result:= GetQueuedCompletionStatus(Handle,
            NumBytes, CompKey, POverlapped(pOvp), TimeOut);
end;

end.

С AddDevice и FreeDevice, надеюсь, все понятно. Для подключения к пулу поток вызывает WaitCompletion. SetCompletion передает задание свободному потоку пула. В структуру OVERLAPPED добавлено поле, его можно использовать для собственных нужд, например для передачи объекта. Впрочем, это актуально при использовании AddDevice,  при ручном вызове SetCompletion все параметры и поля можно использовать по своему усмотрению.
 NS

15-12-2007 15:08
Вот здесь http://www.gamedev.ru/community/mmorpg/articles/?id=6&page=2 показано как можно пихать в

BOOL GetQueuedCompletionStatus(
  HANDLE CompletionPort,      // the I/O completion port of interest
  LPDWORD lpNumberOfBytesTransferred,// to receive number of bytes
                                    // transferred during I/O
  LPDWORD lpCompletionKey,    // to receive file's completion key
  LPOVERLAPPED *lpOverlapped,  // to receive pointer to OVERLAPPED structure
  DWORD dwMilliseconds        // optional timeout value
);

LPOVERLAPPED свою структуру которая будет автоматически заполняться нужными данными. Никак не могу понять как это сделать... Не могли бы мне помочь?

15-12-2007 13:07 | Сообщение от автора вопроса
Еще порыскал... кажись понял ))) Что получается, необходимо будет всеравно создать около 1000 потоков ( на всякий случай, ведь на сервере одновременно большое кол-во клиентов и если выполняющийся поток переходит в режим ожидания , например Select с таймаутом, то процессорное время отдается следующему потоку, а если их создать всего 2а (у меня 2а процессора) и они оба будут в ожидании то обработка следующего клиента затормозится ). При создании потока надо указывать процедуру в которой все это будет выполняться... не подскажете какие параметры должны быть у процедуры? А то везде указаны для Си а я в нём не особо шарю =\

15-12-2007 12:46
не проще ли создать сразу 500 потоков и каждый из них будет обрабатывать по 20 клиентов. А если клиентов пока нет, то поток замораживается? Это ведь даже быстрее будет нежели 2а несчастных потока будут надрываться....

500? А че не 5000? Откуда возьмется это даже быстрее? У Вас от этого что, количество процессоров увеличится? Ну Бог в помощь...
 NS

15-12-2007 09:48 | Сообщение от автора вопроса
Почитал я про CompletionPort но так и не понял его назначения. Этот порт завершения просто распределяет задачи? Необходим только один порт завершения на весь сервер, на который будут вешаться около 50 000 клиентов и он сам будет обрабатывать все запросы, мне надо лишь создать для него потоки(кол-во потоков = кол-во процессоров в системе)? Неясно что-то получается. не проще ли создать сразу 500 потоков и каждый из них будет обрабатывать по 20 клиентов. А если клиентов пока нет, то поток замораживается? Это ведь даже быстрее будет нежели 2а несчастных потока будут надрываться.... =\

15-12-2007 02:15
Я вот попробовал в гугле - получил
http://www.google.ru/search?hl=ru&q=IoCompletionPort&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=lang_ru
Расскажите, как у Вас получается не находить. Про MSDN я вообще молчу:(

А вообще рекомендую Рихтера, есть много где, в том числе
http://www.google.ru/search?complete=1&hl=ru&newwindow=1&q=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D1%85+%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=lang_ru

 NS

14-12-2007 15:15 | Сообщение от автора вопроса
Поискал по MSDN, тут на Королевстве и на Яндексе... нигде конкретно не говорится что такое IoCompletionPort и с чем его едят. Не подкинете ссылочку если таковые есть, пожалуйста.

13-12-2007 09:38
Каждый поток на сервере обрабатывает по несколько клиентов, т.к. существует лимит потоков из-за превышения 2гигобайтного предела памяти выделенного приложению

Это вряд-ли. Вам уже намекали на IoCompletionPort.

По мне, так прежде всего нужно прикинуть исходя из назначения сервера минимальную, пиковую и среднюю нагрузку, то бишь количество одновременно обрабатываемых запросов и время на обработку запроса, а уже исходя из этого строить архитектуры. Причем вполне возможно, что стратегия при разных уровнях нагрузки потребуется совершенно разная - то есть потребуется механизм, оценивающий нагрузку и выбирающий ту или иную стратегию, как правило нет смысла иметь одновременно выполняющих обработку потоков больше, чем имеется процессоров в системе, и тут Completion Port будет как нельзя кстати. Вполне вероятно, что потребуется организовать очередь входящих запросов на моменты пиковой нагрузки. И, разумеется продумать защиту от перегрузки, т.е. ограничить длину этой очереди.

Далее уже можно думать о способах рапараллеливания, то есть об организации пула потоков, а без него Вам не обойтись
 NS

13-12-2007 06:39
из-за превышения 2гигобайтного предела памяти
Переходите на 64 битную ОС.

13-12-2007 05:31 | Сообщение от автора вопроса
Мне необходимо написать сервер, который будет "вмещать" в себя около 50 000 пользователей онлайн. Я уже выбрал объектную базу. Каждый поток на сервере обрабатывает по несколько клиентов, т.к. существует лимит потоков из-за превышения 2гигобайтного предела памяти выделенного приложению (1н поток - 1н стек - 1н стек = 64 кб, и в сумме около 2000 потоков уже больше чем 2гб). Но мне необходимо организовать эту структуру. Где мне про это прочитать ?

15-10-2007 00:42 | Вопрос к автору: запрос дополнительной информации
Что за сервер хотите?

14-10-2007 11:25 | Вопрос к автору: запрос дополнительной информации
Что подразумевается под словом "модели"? Что именно вы хотите услышать?

14-10-2007 10:50 | Сообщение от автора вопроса
Ребят... не такой я уж и дятел))) Это все знаю. В системно программировании уже сижу а вы меня сокеты учить отправляете)))
Я имею ввиду где можно прочитать про существующие модели таких серверов. так сказать хочу запастись информацией которая может мне помочь по ходу составления своей модели.

14-10-2007 07:23
Также, если под Windows, почитать про порты завершения ввода-вывода (IoCompletionPort) и о том, чем они могут помочь при создании такого сервера.

14-10-2007 06:49
Под какую операционную систему? Что должен выполнять?
Раз вы здесь то думаю писать хотите на delphi под windows.
В целом вам для начала нужно изучить хотябы основные сетевые протоколы
Http http://tools.ietf.org/html/rfc2616
Smtp http://www.ietf.org/rfc/rfc0821.txt?number=821
Pop  http://www.ietf.org/rfc/rfc1939.txt?number=1939
Ftp  http://www.ietf.org/rfc/rfc0959.txt?number=959

Далее изучить winsock (если писать будете под виндовс)
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060

Потом освоить многопоточность
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1125

И можно приступать :)


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования