ÊÖ»úÕ¾
ÍøÍ¨·ÖÕ¾
µçÐÅÖ÷Õ¾
ÃÜ¡¡Âë:
Óû§Ãû£º
µ±Ç°Î»Öà : Ö÷Ò³>³ÌÐòÉè¼Æ>delphi>Áбí

Delphi×é¼þindy 10ÖÐIdTCPServerÐÞÕý¼°SSLʹÓÃÐĵÃ

À´Ô´£º»¥ÁªÍø ×÷ÕߣºÎ÷²¿ÊýÂë ʱ¼ä£º2008-04-09
Î÷²¿ÊýÂë-È«¹úÐéÄâÖ÷»ú10Ç¿£¡40ÓàÏîÐéÄâÖ÷»ú¹ÜÀí¹¦ÄÜ,È«¹úÁìÏÈ!Ë«Ïß¶àÏßÐéÄâÖ÷»úÄϱ±·ÃÎʳ©Í¨ÎÞ×è!Ãâ·ÑÔùËÍÆóÒµÓʾÖ,.CNÓòÃû,×ÔÖú½¨Õ¾480ÔªÆð,Ãâ·ÑÊÔÓÃ7Ìì,ÂúÒâÔÙ¸¶¿î! P4Ö÷»ú×âÓÃ799Ôª/ÔÂ.Ô¸¶Ãâѹ½ð!

indy 10ÖÕÓÚËæ×ÅDelphi2005·¢²¼ÁË£¬²»¹ýindyÌ×¼þÔÚÎÒµÄÓ¡ÏóÖÐ×ÜÊǸ´ÔÓ²¢ÇÒBUG²»¶Ï£¬ËµÊµ»°£¬²»ÊÇ¿´ÔÚËûÒ»ÕûÌ××é¼þµÄÃæ×ÓÉÏ£¬ÎÒ»¹ÊÇϲ»¶VCLÔ­ÉúµÄSocket×é¼þ£¬¼ò½à£¬ÇåÎú¡£Indy9·¢Õ¹µ½ÁËindy10¼¸ºõÍêÈ«²»¼æÈÝ£¬¿É̾°¡¡£ÑÔ¹éÕý´«¡£ÔÚʹÓÃIdTCPServer×é¼þµÄʱºò·¢ÏÖÁËËûµÄ©¶´£¬ËûµÄOnConnec£¬OnExecute£¬OnDisconnectµÈʼþÊÇÔÚÆäËûÏß³ÌÖÐÖ´Ðеģ¬Í¨³£Çé¿öÏÂÕâûÓÐÎÊÌ⣬µ«ÊÇÔÚÌØÊâµÄÇé¿öÏ»áÔì³ÉÎÊÌ⣬Èç¹ûÆäËû²¿·ÖµÄ³ÌÐòдµÃÓÐÎÊÌâ¾Í»á³öÏÖ©¶´¡£

ÎÒ·¢Ïֵĩ¶´ÊÇÕâÑùµÄ£¬ÎÒÔÚOnDisconnectʼþÖÐÊÍ·ÅÒ»¸öListViewµÄÒ»¸ö¶ÔÓ¦µÄItem£¬Ò²¾ÍÊÇ£¬Ò»¸ö¿Í»§¶ËÀ뿪µÄʱºò£¬½çÃæÉϵÄListView¶ÔÓ¦µÄÏîĿɾ³ý¡£Õý³£Çé¿öûÓÐÈκÎÎÊÌ⣬µ«ÊÇ£¬Èç¹û²»¶Ï¿ªÁ¬½ÓÖ±½Ó¹Ø±Õ³ÌÐò¾Í»áËÀµô£¬ÊÂʵÉÏÎÒÔÚ³ÌÐòÖÐFormµÄCloseQueryʼþÖÐ×÷ÁË´¦Àí£¬ÔÚÕâ¸öʼþÖÐÎҹرÕÁ¬½Ó£¬µ«ÊÇ£¬Ã»ÓÐЧ¹û£¬Ö»ÓÐÔÚ³ÌÐòÖÐÊÖ¶¯µÄµãÊó±ê¹Ø±Õ²Å²»»áËÀµô£¬ÎÊÌâ³öÔÚÄÄÀ

ÎÊÌâ³öÔÚÕâÀListViewÊÇÒ»¸öWindowsµÄ±ê×¼×é¼þ£¬ÊÍ·ÅËûµÄÒ»¸öItemÊÇͨ¹ýÏûÏ¢Íê³ÉµÄ£¬Ò²¾ÍÊÇ˵£¬ÎÒÔÚOnDisconnectÖÐÔÚÒ»¸ö·ÇÖ÷Ï̵߳ÄÏß³ÌÖÐÏòÖ÷Ï̵߳Ĵ°¿Ú·¢ËÍÏûÏ¢²¢Çҵȴý·µ»Ø¡£¶ø´ËʱÖ÷Ïß³ÌÔÚ¸ÉÂïÄØ£¿ÒòΪÊÇÖ÷Ï̴߳¥·¢µÄDisConnect£¬ËùÒÔËûÔڵȴýÕâ¸ö¶Ë¿ÚµÄ·þÎñÏß³Ì¹ÒÆð£¬ÕâÑù¾Í·¢ÉúËÀËø£¬ÎÊÌâÔÚÓÚ£¬Ö÷Ï̵߳ĵȴý·þÎñÏß³Ì¹ÒÆðµÄ´¦Àí´úÂë²»µ±£¬ËüÀíÂÛÉÏÓ¦¸ÃÔڵȴýͬʱ´¦ÀíÏûÏ¢¡£Ô­´úÂëÈçÏÂËùʾ

procedure TIdSchedulerOfThread.TerminateYarn(AYarn: TIdYarn);
var
LYarn: TIdYarnOfThread;
begin
LYarn := TIdYarnOfThread(AYarn);
if LYarn.Thread.Suspended then begin //ÅжÏÊÇ·ñ¹ÒÆðÁË£¬¹ÒÆðÁ˲ÅÊÍ·ÅÏß³Ì
// If suspended, was created but never started
// ie waiting on connection accept
LYarn.Thread.Free;
FreeAndNil(LYarn);
end else begin
// Is already running and will free itself
LYarn.Thread.Stop; //ûÍêûÁ˵ĵ÷ÓÃStop¹ý³Ì£¬È´²»´¦ÀíÈκÎÏûÏ¢ºÍͬ²½Ê¼þ

// Dont free the yarn. The thread frees it (IdThread.pas)
end;
end;

ËüµÄÉÏÒ»¼¶µ÷ÓÃÕߣ¬Ã»ÍêûÁ˵ÄÅжϷþÎñÏß³ÌÊýÁ¿£¬È»ºóûÍêûÁ˵ص÷ÓÃÉÏÃæÕâ¸öº¯Êý£¬µ÷ÓÃÕßÔ­´úÂëÈçÏÂ

procedure TIdTCPServer.TerminateAllThreads;
var
i: Integer;
begin
// TODO: reimplement support for TerminateWaitTimeout

//BGO: find out why TerminateAllThreads is sometimes called multiple times
//Kudzu: Its because of notifications. It calls shutdown when the Scheduler is
// set to nil and then again on destroy.
if Contexts <> nil then begin
with Contexts.LockList do try
for i := 0 to Count - 1 do begin
// Dont call disconnect with true. Otheriwse it frees the IOHandler and the thread
// is still running which often causes AVs and other.
TIdContext(Items[i]).Connection.Disconnect(False);
end;
finally Contexts.UnLockList; end;
end;

// Scheduler may be nil during destroy which calls TerminateAllThreads
// This happens with explicit schedulers
if Scheduler <> nil then begin
Scheduler.TerminateAllYarns;
end;
end;

˵ʵ»°£¬ÎҺܲ»Àí½âindyÏ̶߳ÔÏóÓÖÊÇstopÓÖÊÇstartµÄ¸´ÔÓÄ£ÐÍÒâÒåºÎÔÚ£¬¶øÇҷdz£ÈÝÒ׳öÎÊÌ⣬¼òµ¥µÄÏß³ÌÄ£Ð͸ü¼Ó¿É¿¿ºÍʵÓá£

Ð޸ĵķ½·¨ºÜ¼òµ¥£¬µ«ÊÇ¿¼Âǵ½¼æÈÝLinuxºÍÆäËûƽ̨µÄÎÊÌ⣬»¹±ØÐë½øÐиôÀë·Ö½â²ã´Î£¬ËùÒÔÉÔ΢¸´ÔÓÁËÒ»µãµã¡£¾ÍÊÇÔÚidThreadÀàÖÐÔö¼ÓÒ»¸ö¹«¿ªµÄ·½·¨ProcessMessages£¬È»ºóÔÚTerminateYarnÖе÷ÓᣴúÂëÈçÏÂ

procedure TIdThread.ProcessMessages;
begin
{$IFDEF MSWINDOWS}
if GetCurrentThreadID = MainThreadID then
begin
CheckSynchronize;
Application.ProcessMessages;
end;
{$ENDIF}
{$IFDEF LINUX}
if GetCurrentThreadID = MainThreadID then
begin
CheckSynchronize(1000);
end;
{$ENDIF}
end;

procedure TIdSchedulerOfThread.TerminateYarn(AYarn: TIdYarn);
var
LYarn: TIdYarnOfThread;
begin
LYarn := TIdYarnOfThread(AYarn);
if LYarn.Thread.Suspended then begin
// If suspended, was created but never started
// ie waiting on connection accept
LYarn.Thread.Free;
FreeAndNil(LYarn);
end else begin
// Is already running and will free itself
LYarn.Thread.Stop;
LYarn.Thread.ProcessMessages; //´Ë´¦Ôö¼ÓÁË´¦Àí¡£
// Dont free the yarn. The thread frees it (IdThread.pas)
end;
end;

TidThreadËùÔÚµ¥ÔªÔö¼Óuses

{$IFDEF MSWINDOWS}
Windows, Forms,
{$ENDIF}
ÖÁ´Ë³ÌÐòÕý³£¡£

ËäÈ»ÀíÂÛÉÏ£¬ÔÚÆäËûÏß³ÌÖзÃÎÊVCL×é¼þÓ¦µ±Ê¹ÓÃÏß³Ìͬ²½·½·¨£¬µ«ÊÇÔÚÕâ¸öÀý×ÓÖÐÓÉÓÚ¹¤×÷Ḭ̈߳ü×°Ì«ÉîÒѾ­ÎÞ·¨Ê¹ÓÃÏß³Ìͬ²½·½·¨ÁË£¬ÆäʵÔÚÕâ¸öÀý×ÓÖм´Ê¹Ê¹ÓÃÁËÏß³Ìͬ²½·½·¨À´·ÃÎÊVCLÒ²ÎÞ¼ÃÓÚÊ£¬ÒòΪÔڵȴýÏ߳̽áÊøµÄ³ÌÐòÖиù±¾Ã»Óмì²éÖ÷Ï̵߳Äδ½áÏûÏ¢ºÍÏß³Ìͬ²½Ê¼þ£¨Delphi7ÒÔºó°æ±¾Ïß³Ìͬ²½·½·¨Ê¹ÓÃʼþevent×÷Ϊͬ²½·½·¨£¬Delphi7֮ǰʹÓÃÏûϢͬ²½£©Ò»Ñù»áËÀËø¡£

ÆäʵVCL²¢Ã»ÓÐÇ¿ÖÆÖ÷Ï̷߳ÃÎÊ£¬ËûµÄ˵Ã÷ÊÇÕâÑùµÄ£¬ËüÒªÇóÔÚÈκÎʱºòÓ¦µ±Ö»ÓÐÒ»¸öÏ̷߳ÃÎÊVCLµÄÏà¹Ø´úÂ루²»Í¬µÄÏß³Ìͬʱ·ÃÎʲ»Ïà¹ØµÄVCL´úÂë¶ÎÊÇûÓÐÎÊÌâµÄ£©£¬ËùÒÔ£¬²»Ê¹ÓÃÏß³Ìͬ²½·½·¨·ÃÎÊVCLÒ²ÊÇ¿ÉÒԵ쬵«ÊÇҪʹÓÃÆäËû·½·¨±£Ö¤·ÃÎʵÄΨһ£¬±ÈÈç¿ÉÒÔʹÓÃÁÙ½çÇø¡£

ÏÂÃæÊÇʹÓÃSSLµÄÐĵá£

ÎÄÕÂÕûÀí£ºÎ÷²¿ÊýÂë--רҵÌṩÓòÃû×¢²á¡¢ÐéÄâÖ÷»ú·þÎñ
http://www.west263.com
ÒÔÉÏÐÅÏ¢ÓëÎÄÕÂÕýÎÄÊDz»¿É·Ö¸îµÄÒ»²¿·Ö,Èç¹ûÄúÒª×ªÔØ±¾ÎÄÕÂ,Çë±£ÁôÒÔÉÏÐÅÏ¢£¬Ð»Ð»!