Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как оптимизировать работу в данном случае?


Страницы:   1 2

Cooller ©   (2006-10-11 09:32:00) 

Есть серверное приложение (активная одновременная работа с 1000+ клиентами). Пишется "навес" ввиде DLL, перехватывающий и анализирующий весь входящий траффик (функции send/recv). Для каждого соединения необходимо хранить некую информацию:
TClientData=record
...
end;

Уникальным идентификатором получается может быть только TSocket. Как быстро находить и изменять нужную информацию для каждого клиента? С одной стороны хорошо бы было использовать TSocket в качестве индекса. В модуле WinSock:   TSocket = u_int;
Получается нужно объявить вот такой массив:
aClientData:array [integer] of TClientData
В итоге:
[Error] Unit1.pas(21): Data type too large: exceeds 2 GB
В принципе ничего удивительного

Можно конечно создать динамический массив:
aClientData:array of record
  s:integer;
  data:TClientData;
  end;

Но при получении каждого пакета производить поиск по такому массиву - слишком накладное занятие (повторюсь - активная одновременная работа с 1000+ клиентами).

Как быть, что посоветуете?


Cooller   (2006-10-11 20:33:00) [1]

Вот к примеру:
function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

Если память уже 64х разрядная, то указатель buf также 64х разрядный. В Delphi это ведь никак не реализовать...


Cooller   (2006-10-11 18:25:00) [2]

А вообще 32х разрядная библиотека сможет нормально функционировать в 64х разрядном приложении?


Сергей М.   (2006-10-11 17:45:00) [3]

значит ищи заголовочные файлы для ws2_ 64.dll (или как ее там для 64-разрядной версии зовут - не в курсе)


Cooller   (2006-10-11 17:40:00) [4]

Windows 2003 Server 64


Сергей М.   (2006-10-11 17:40:00) [5]


> Cooller   (11.10.06 17:34) [28]


ОС какая ?


Cooller   (2006-10-11 17:34:00) [6]

Чувствую тут возникнет путаница...

Получается заголовок будет такой?
function MyRecv(s: int64; var Buf; len, flags: in64): int64; stdcall;
Или я сейчас бред написал? =)


Сергей М.   (2006-10-11 17:27:00) [7]


> Надо ли это учитывать при перехвате send/recv?


Надо, если ОС имеет соотв.разрядность


Cooller   (2006-10-11 17:25:00) [8]

Еще вопрос... Сервер 64х разрядный и работает в 64х разрядной системе. Надо ли это учитывать при перехвате send/recv?

function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;


Ketmar   (2006-10-11 16:58:00) [9]

ещё можно "корзинки" использовать -- array [0..255] of array [...] of ... %-)

зыж номера сокетам назначаются не всегда "по-порядку". помедитируй над исходниками wsock.


Сергей М.   (2006-10-11 16:12:00) [10]

В том что перехватываемые тобой send/recv-ф-ции могут вызываться из разных кодовых потоков.


Cooller   (2006-10-11 16:07:00) [11]

2 Сергей М
А в чем именно загвоздка?


Сергей М.   (2006-10-11 15:39:00) [12]


> Cooller   (11.10.06 15:34) [20]


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


Cooller   (2006-10-11 15:37:00) [13]

А так памяти оперативной достаточно - 4Гб


Cooller   (2006-10-11 15:34:00) [14]

2atruhin
Socket - U_INT (0..$FFFFFFFF)


Сергей М.   (2006-10-11 15:21:00) [15]


> atruhin ©   (11.10.06 15:16) [18]


При заданных автором условиях - не согласен.


atruhin   (2006-10-11 15:16:00) [16]

> [17] Сергей М. ©   (11.10.06 14:51)

Да тут ошибся. array [0..65535] of PaClientData; 256кб. Если это допустимо, по расходу памяти, то самый простой и быстрый вариант.


Сергей М.   (2006-10-11 14:51:00) [17]


> atruhin ©   (11.10.06 14:41) [16]


И нафиг он нужен, этот массив слов ? С какого боку его к теме автора присандалить ?


atruhin   (2006-10-11 14:41:00) [18]

А не проще создать прямой массив array [0..65535] of word; всего 128 кб для севрера не так много, зато ни какого поиска.


Cooller   (2006-10-11 13:10:00) [19]

Добавление и удаление очень редко. Соединение в среднем длится около часа.


MBo   (2006-10-11 13:09:00) [20]

Если добавление/удаление элементов происходит часто, лучше деревом или хэшем воспользоваться.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо