Модератор: Модераторы
Padre_Mortius писал(а): Прежде, чем так утверждать, нужно головой думать.
Я повторю тоже самое. Вы никогда не работали в большой организации.
Если речь идет о корпорациях, то там на FreePascal в принципе никто не даст написать средство передачи файлов по сети.
В большинстве случаев там пишут на том, что знают сотрудники (а в большинстве случаев это вообще оказывается VBA), если надо, то за примерами можно сходить на тот же hh.ru.
Шаг вправо или влево - расстрел, таковы правила крупных корпораций, которые не хотят разбираться как устроена некая частная технология.
Под каждый проект пишется документация и определяются ресурсы, которые необходимы данному проекту. Ресурсы эти определяются только по согласованию с системными администраторами и безопасниками. Решения же на основе сокетов в большинстве случаев будут опасней нежели стандартные http, ftp или smb
vitaly_l писал(а): По возможности надо в своих приложениях надо придерживаться общепринятых стандартов
Лично я - говорю тоже самое... Топик стартер создаёт кросплатформенную сеть (файловый сервер)... Соответственно нужно использовать кросплатформенные разработки высокого уровня..., (а не писать код на низкоуровневом машинном языке, когда есть Лазарус...) <=== метафора для аналогии![]()
alexey38 писал(а):Что такое "крутые фишки"? Если простая задача по передачи файла в рамках локальной сети решена с использованием sql-сервера и web-сервера, то именно такая реализация будет называться с использованием "крутых фишек".
alexey38 писал(а): В самих низкоуровневых функциях нет дыр, т.к.
alexey38 писал(а):Полезно просто полазить в исходниках высокоуровневой библиотеки.
alexey38 писал(а):нужно изучать и изучать. В отличие от этих наворотов, про сокет не нужно знать много. Это на несколько порядков проще и понятнее.
Mr.Smart писал(а):т.е. Протокол HTTP, FTP и т.п. используют именно Сокеты для соединения и передачи данных...
stikriz писал(а):А где тут для обмена и обработки? Нету?
stikriz писал(а):Гусь тоже и летает и плавает и ходит... И все это он делает плохо.
2. Ваша философия считает VBA оскорблением. Но факт в том, что VBA является стандартом для очень многих корпораций. И там пишут на VBA не потому, что лохи. А потому, что только так разрешено.
ИТ-администрация (в корпорациях это не админ, а дирекция по ИТ) и службы безопасности в крупных корпорациях в 99% случаях требуют применения стандартного для их корпорации софта. Этой ИТ-дирекции лень разбираться в 100 модификациях SQL-серверов и т.п.
Если простая задача по передачи файла в рамках локальной сети решена с использованием sql-сервера и web-сервера, то именно такая реализация будет называться с использованием "крутых фишек". По ней можно написать статью, защитить диссертацию, получить премию за навороты от непонимающего начальства
4. Чтобы передать файл по сети через сокет нужно знать, предположим, 10 единиц информации (набор функций и иметь общее понимание об TCP, IP, OSI и т.п.). Чтобы реализовать передачу файлов через веб-сервер нужно знать 100 единиц информации. Установили веб-сервер по дефолту. А безопасно ли это дефолтное состояние? Открываешь конфигурационный файл того же Apche и там 1000 настроек. Нужно их менять или оставить по дефолту? Можно прикомпилировать некий веб-сервер к своему приложению, а у него ведь тоже не одна функция. Как это работает? Кто знает, нужно изучать и изучать. В отличие от этих наворотов, про сокет не нужно знать много. Это на несколько порядков проще и понятнее.
Сокет-сервер нужно написать на обработку только нужных Вам запросов.
Этой ИТ-дирекции лень разбираться в 100 модификациях SQL-серверов и т.п.
в) При использовании низкоуровневого API пишется только требуемый функционал. Иного функционала нет, поэтому и дыр нет.
vitaly_l писал(а):Сокеты - для обмена и обработки...
stikriz писал(а):Оптимизирывать по всем свойствам невозможно - это закон природы. Иначе не было бы видов - достаточно одного животного.
Padre_Mortius писал(а):Мне бы вашу уверенность. Для написания сервера на тех же сокетах, нужно будет не только разрулить вопросы безопасности, целостности протокола передачи данных, но еще и разрулить нормальную очередь сообщений, с которой у большинства программистов почему-то возникают проблемы.
TUnParametr = class(TObject)
private
FName: string;
FParamType: TUnParamType;
FTag: Integer;
procedure CreateConvertionError(ADataType: TUnDataTypes);
protected
function GetAsBlob: TStream; virtual;
procedure SetAsBlob(AValue: TStream); virtual;
function GetAsInt64: Int64; virtual;
function GetAsBoolean: boolean; virtual;
function GetAsByte: Byte; virtual;
function GetAsCardinal: Cardinal; virtual;
function GetAsCurrency: Currency; virtual;
function GetAsDateTime: TDateTime; virtual;
function GetAsDouble: Double; virtual;
function GetAsGUID: TGUID; virtual;
function GetAsLongInt: LongInt; virtual;
function GetAsShortInt: ShortInt; virtual;
function GetAsSingle: Single; virtual;
function GetAsSmallint: Smallint; virtual;
function GetAsString: string; virtual;
function GetAsWord: Word; virtual;
function GetDataType: TUnDataTypes; virtual; abstract;
function GetValue: Variant; virtual; abstract;
function GetWideString: WideString; virtual;
procedure SetAsBoolean(AValue: boolean); virtual;
procedure SetAsByte(AValue: Byte); virtual; abstract;
procedure SetAsCardinal(AValue: Cardinal); virtual;
procedure SetAsCurrency(AValue: Currency); virtual;
procedure SetAsDateTime(AValue: TDateTime); virtual;
procedure SetAsDouble(AValue: Double); virtual;
procedure SetAsGUID(AValue: TGUID); virtual;
procedure SetAsInt64(AValue: Int64); virtual;
procedure SetAsLongInt(AValue: LongInt); virtual;
procedure SetAsShortInt(AValue: ShortInt); virtual;
procedure SetAsSingle(AValue: Single); virtual;
procedure SetAsSmallint(AValue: Smallint); virtual;
procedure SetAsString(AValue: string); virtual;
procedure SetAsWord(AValue: Word); virtual;
procedure SetValue(AValue: Variant); virtual; abstract;
procedure SetWideString(AValue: WideString); virtual;
public
procedure LoadFromStream(AStr: TStream); virtual;
procedure SaveToStream(AStr: TStream); virtual;
property DataType: TUnDataTypes read GetDataType;
property ParamType: TUnParamType read FParamType write FParamType;
property Value: Variant read GetValue write SetValue;
// Int
property AsShortInt: ShortInt read GetAsShortInt write SetAsShortInt;
property AsSmallint: Smallint read GetAsSmallint write SetAsSmallint;
property AsByte: Byte read GetAsByte write SetAsByte;
property AsWord: Word read GetAsWord write SetAsWord;
property AsLongInt: LongInt read GetAsLongInt write SetAsLongInt;
property AsCardinal: Cardinal read GetAsCardinal write SetAsCardinal;
property AsInt64: Int64 read GetAsInt64 write SetAsInt64;
// Float
property AsSingle: Single read GetAsSingle write SetAsSingle;
property AsDouble: Double read GetAsDouble write SetAsDouble;
property AsCurrency: Currency read GetAsCurrency write SetAsCurrency;
// String
property AsString: string read GetAsString write SetAsString;
property AsWideString: WideString read GetWideString write SetWideString;
property AsBoolean: boolean read GetAsBoolean write SetAsBoolean;
property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
property AsGUID: TGUID read GetAsGUID write SetAsGUID;
// Blob
property AsBlob: TStream read GetAsBlob write SetAsBlob;
property Name: string read FName write FName;
property Tag: Integer read FTag write FTag;
end;
{ TUnCommand }
TUnCommand = class(TObject)
private
FErrorCode: Integer;
FErrorString: string;
FListVariables: TList;
FName: string;
FTag: Integer;
function GetCount: Integer;
function GetParam(AIndex: Integer): TUnParametr;
protected
public
constructor Create;
destructor Destroy; override;
procedure Clear;
procedure LoadFromStream(AStr: TStream);
procedure SaveToStream(AStr: TStream);
function ParamByName(const AName: string): TUnParametr;
function FindParam(const AName: string; var AParam: TUnParametr): boolean;
procedure Remove(AParam: TUnParametr);
procedure Delete(AIndex: Integer; ADeleteParam: boolean = true);
function GetNew(ADataType: TUnDataTypes): TUnParametr; overload;
function GetNew(AValue: boolean): TUnParametr; overload;
function GetNew(AValue: Byte): TUnParametr; overload;
function GetNew(AValue: Cardinal): TUnParametr; overload;
function GetNew(AValue: Currency): TUnParametr; overload;
function GetNew(AValue: TDateTime): TUnParametr; overload;
function GetNew(AValue: Double): TUnParametr; overload;
function GetNew(AValue: TGUID): TUnParametr; overload;
function GetNew(AValue: Int64): TUnParametr; overload;
function GetNew(AValue: LongInt): TUnParametr; overload;
function GetNew(AValue: ShortInt): TUnParametr; overload;
function GetNew(AValue: Single): TUnParametr; overload;
function GetNew(AValue: Smallint): TUnParametr; overload;
function GetNew(AValue: string): TUnParametr; overload;
function GetNew(AValue: Word): TUnParametr; overload;
function GetNew(AValue: WideString): TUnParametr; overload;
property Param[AIndex: Integer]: TUnParametr read GetParam; default;
property Count: Integer read GetCount;
property Name: string read FName write FName;
property Tag: Integer read FTag write FTag;
property ErrorString: string read FErrorString write FErrorString;
property ErrorCode: Integer read FErrorCode write FErrorCode;
end;
{ TUnPacket }
TUnPacket = class(TObject)
private
FListCommands: TList;
function GetCount: Integer;
function GetItems(AIndex: Integer): TUnCommand;
protected
public
constructor Create;
destructor Destroy; override;
procedure Clear;
function CommandByName(const AName: string): TUnCommand;
function FindCommand(const AName: string; var ACommand: TUnCommand): boolean;
procedure LoadFromStream(AStr: TStream);
procedure SaveToStream(AStr: TStream);
function Add: TUnCommand;
procedure Remove(ACommand: TUnCommand);
procedure Delete(AIndex: Integer; ADeleteParam: boolean = true);
property Commands[AIndex: Integer]: TUnCommand read GetItems; default;
property Count: Integer read GetCount;
end;
{ TUnParamBoolean }
TUnParamBoolean = class(TUnParametr)
private
FValue: boolean;
protected
function GetAsInt64: Int64; override;
function GetAsBoolean: boolean; override;
function GetAsLongInt: LongInt; override;
function GetAsShortInt: ShortInt; override;
function GetAsSmallint: Smallint; override;
procedure SetAsBoolean(AValue: boolean); override;
procedure SetValue(AValue: Variant); override;
function GetValue: Variant; override;
function GetDataType: TUnDataTypes; override;
public
procedure LoadFromStream(AStr: TStream); override;
procedure SaveToStream(AStr: TStream); override;
end;
function TDmDatabase.Run(APacket: TUnPacket): boolean;
var I: Integer;
TmpCommand: TUnCommand;
begin
Result:=true;
try
for I:=0 to APacket.Count-1 do
begin
TmpCommand:=APacket[I];
Result:=Result and RunCommand(TmpCommand);
end;
except
Result:=false;
end;
end;
function TDmDatabase.RunCommand(ACommand: TUnCommand): boolean;
var Func: TServerMethod;
I: Integer;
Par: TUnParametr;
begin
try
Result:=false;
if FListMethods.Find(ACommand.Name, Func) then
Result:=Func(ACommand)
else
Result:=false;
I:=0;
while I < ACommand.Count do
begin
Par:=ACommand.Param[I];
if Par.ParamType in [unpt_Const, unpt_Input] then
ACommand.Delete(I)
else
I:=I+1;
end;
except on E: Exception do
begin
if E.ClassType = EUnDatabaseError then
begin
ACommand.ErrorCode:=EUnDatabaseError(E).ErrorCode;
ACommand.ErrorString:=E.Message;
end
else
begin
ACommand.ErrorCode:=-1;
ACommand.ErrorString:=E.Message;
end;
end;
end;
end;
procedure TDmDatabase.AddMethods(AListMethods: TUnListMethods);
begin
AListMethods.Add('RegistryUser', @RegistryUser);
AListMethods.Add('UnRegistryUser', @UnRegistryUser);
AListMethods.Add('GetFile', @GetFile);
AListMethods.Add('SendMessage', @SendMessage);
AListMethods.Add('GetListClient', @GetListClient);
AListMethods.Add('GetVersion', @GetVersion);
AListMethods.Add('GetListDatabases', @GetListDatabases);
AListMethods.Add('GetListUsers', @GetListUsers);
Padre_Mortius писал(а):И получить ни с чем не совместимый уникальный сервис.
vitaly_l писал(а):Ага... теперь мне понятна эволюция видов...stikriz рулит: теория Дарвина - отдыхает...
stikriz писал(а):Так это и есть эволюция.
stikriz писал(а):Не надо думать, что это все какое-то волшебство. Один раз написать болванку сервера, и юзай всю жизнь
vitaly_l писал(а): в вашем случае - роста нет, значит нет и эволюции.
vitaly_l писал(а):Далеко не факт, что это эволюция.
Сейчас этот форум просматривают: Yandex [Bot] и гости: 230