有关ScktSrvr传输的压缩、加密及超时解决方法求教高手
各位大侠,小弟最近做一个Midas三层服务器,遇到不少问题,查看了以前的帖子,仍没有解决,还请大家帮忙解决,我分只有这么多,真不好意思,问题如下:
1、压缩
我知道用intrcpt.dll注册可能解决,但我想把它和Scktsrvr接合在一起,在服务端与客户端不需要注册就可以实现,请问怎么解决运用,即怎么样在Scktsrvr中调用DataIn和DataOut,因为我没有做成Com+,所以想直接接合在一起。
2、加密
怎么把加密也接合在Scktsrvr中。
3、什么好方法能解决超时的问题。
4、Scktsrvr中的ClientExecute过程怎么修改达到最好,ClientExecute源码如下,请帮忙。
procedure TSocketDispatcherThread.ClientExecute;
var
Data: IDataBlock;
msg: TMsg;
Obj: ISendDataBlock;
Event: THandle;
WaitTime: DWord;
begin
CoInitialize(nil);
try
Synchronize(AddClient);
FTransport := CreateServerTransport;
try
Event := FTransport.GetWaitEvent;
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
GetInterface(ISendDataBlock, Obj);
if FRegisteredOnly then
FInterpreter := TDataBlockInterpreter.Create(Obj, SSockets) else
FInterpreter := TDataBlockInterpreter.Create(Obj, '');
try
Obj := nil;
if FTimeout = 0 then
WaitTime := INFINITE else
WaitTime := 60000;
while not Terminated and FTransport.Connected do
try
case MsgWaitForMultipleObjects(1, Event, False, WaitTime, QS_ALLEVENTS) of
WAIT_OBJECT_0:
begin
WSAResetEvent(Event);
Data := FTransport.Receive(False, 0);
if Assigned(Data) then
begin
FLastActivity := Now;
FInterpreter.InterpretData(Data);
Data := nil;
FLastActivity := Now;
end;
end;
WAIT_OBJECT_0 + 1:
while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
DispatchMessage(msg);
WAIT_TIMEOUT:
if (FTimeout > 0) and ((Now - FLastActivity) > FTimeout) then
FTransport.Connected := False;
end;
except
FTransport.Connected := False;
end;
finally
FInterpreter.Free;
FInterpreter := nil;
end;
finally
FTransport := nil;
end;
finally
CoUninitialize;
Synchronize(RemoveClient);
end;
end;
问题点数:100、回复次数:5Top
1 楼trainbox(rain)回复于 2004-12-03 10:50:48 得分 0
TSocketConnection就有关于intrcpt的设置,至于超时,这个只有增加timeout的值了
加解密算法很多的,搜索一下就有了Top
2 楼pengmai(阿迈)回复于 2004-12-03 15:02:10 得分 0
to : trainbox
thanks Your Answer。我也知道有啊,加密算法也知道,可不知道怎么加进去,做成Dll是没问题,可要注册,太麻烦了,我用的是midas,想只接写进去,而不用注册,能详细一点吗?Top
3 楼halfdream(哈欠)回复于 2004-12-03 15:48:23 得分 100
要改楼主可以从这儿下手。。其它地方不用变化。
function TSocketTransport.CheckInterceptor: Boolean;
var
GUID: TGUID;
begin
if not Assigned(FInterceptor) and (FInterceptGUID <> '') then
if not FCreateAttempted then
try
FCreateAttempted := True;
Guid := StringToGuid(FInterceptGUID);
FInterceptor := CreateComObject(Guid) as IDataIntercept;
except
{ raise no exception if the creating failed }
end;
Result := Assigned(FInterceptor);
end;
比如改成:
//===========================================================
function TSocketTransport.CheckInterceptor: Boolean;
var
GUID: TGUID;
begin
if not Assigned(FInterceptor) then
try
FInterceptor:=CreateMyInterceptor;
except
{ raise no exception if the creating failed }
end;
Result := Assigned(FInterceptor);
end;
function CreateMyInterceptor:IInterceptor;
begin
Result:=TMyInterceptor.Create;
end;
TMyInterceptor=class(TInterfacedObject,IInterceptor)
....
end;
Top
4 楼pengmai(阿迈)回复于 2004-12-03 17:16:16 得分 0
谢谢halfdream的回答,我先着去试试看,有结果再来散分。Top
5 楼nyf1220(我是党员----不过听说最近风声紧,打算换名字)回复于 2004-12-03 17:34:11 得分 0
呵呵,学习下Top




