![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как оптимизировать работу в данном случае?
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]Если добавление/удаление элементов происходит часто, лучше деревом или хэшем воспользоваться.