TClientSocket,程序怎么了?(60分)

  • 主题发起人 主题发起人 jchc
  • 开始时间 开始时间
J

jchc

Unregistered / Unconfirmed
GUEST, unregistred user!
我要实现扫描某机器给定范围内的端口,用TClientSocket连。程序如下:
。。。
for i:=startport to finport do
begin
with ClientSocket1 do
begin
Active:=False;
Port:=i;
Open;
Close;
end;
end;
在onConnect中:
begin
Memo1.Lines.Add(IntToStr(ClientSocket1.Port));
end;
在onerror中:
begin
Abort;
end;
我只想把能连上的加到memo1中。但比如我测试80到90,80可用,结果显示10个80。为什么?
 
试试把ClientSocket1的ClientType设成ctBlocking
 
这是因为释放不及时.建议用线程,既提高了扫描速度,又解决了此类问题.
 
已经是tcBlocking了。既然这样,我想也不应该说是释放不及时。(多线程一来我实际还不太会,二
来觉得占用资源,三来各个线程完成时间不一样,对Memo1里写东西时不一定能按照端口
顺序去写。)有别的招吗?
 
别用空件。
 
那就应该不会了,
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;

type
TForm1 = class(TForm)
Button1: TButton;
ClientSocket1: TClientSocket;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
i,startport,finport:integer;
begin
startport:=80;
finport:=90;
ClientSocket1.ClientType:=ctBlocking;
for i:=startport to finport do
begin
with ClientSocket1 do
begin
Active:=False;
Port:=i;
Open;
Close;
end;
end;

end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin

Memo1.Lines.Add(IntToStr(ClientSocket1.Port));

end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin

Abort;

end;

end.
我这样试过,没错,只返回一个80,是不是你的程序其他地方有错?

 
是我笔误。。。60分跑了。。。
不过,做成后速度很慢,差不多都到每秒一个端口,实在忍受不了。有人有高招吗?(不排斥
多线程,不过要保证扫描的端口按顺序排列)
 
可以用多线程把结果放到一个ListView中,然后按端口排序,就行了。
 
多线程扫描又出现当端口连不上时的异常导致程序终止(原来单线程已经在try..except..
abort中解决掉了),而且又无法调试。(好象根本就不Abort)
 
扫描端口的原理是什么,能否告知,要扫描端口,那ip该设置为什么呢?
 
我不知道别人是怎么做的,反正我就是用TClientSocket一个个去连。连上了就说这个端口可用。
既然扫描端口,ip就定为你要扫描那台机器的地址就行了。
 
后退
顶部