异步socket扫描如何传递附加信息,比如端口(200分)

  • 主题发起人 主题发起人 未来107
  • 开始时间 开始时间

未来107

Unregistered / Unconfirmed
GUEST, unregistred user!

s:= socket(AF_INET,SOCK_STREAM,0); //创建socket句柄
server.sin_port:=htons(strtoint(portlist.Strings[porti])); //端口

if WSAAsyncSelect(S,Form1.handle,WM_SOCKET,FD_ACCEPT or FD_CONNECT or FD_CLOSE or FD_READ or FD_WRITE)=SOCKET_ERROR then
begin
messagebox(application.handle,'无法创建句柄!','警告',MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end;
//异步socket
connect(s,server,sizeof(server)) ;

当connect连接端口后, 会发送上面的消息 wm_socket,下面是处理该消息的过程
procedure TForm1.SockEvent(var msg : Tmessage); //处理socket消息
begin
case msg.LParam of

FD_CONNECT: begin
dspmsg('端口开放');
//表示对方端口开放
end;

end;
end;

现在的问题是如何知道这个"开放的端口"是多少,也就是说,上面在传递消息的时候如何
传递"端口"值!
 
不用传递端口啊
 
T0 老人家
那如何知道端口值?
 
根据 msg.WParam---他的值是发出消息的SOCKET,根据那个SOCKET得知对应的ip/port(是你指定的).
for i:=0 to nn do if s=msg.WParam then ....
 
看你的代码,还不如干脆用TClientSocket算了,
 
无忌大侠,终于盼到你了,我知道你是这方面的高手,你能讲讲关于端口扫描的好办法吗?

tianhf,照你说的我试试看
 
tianhf:

s=msg.WParam;这句话中s?,错误
 
端口扫描还是用线程方式比较好,开几个线程就可以了,最好用select函数,
容易控制,如果想更好,就用半扫描,自己填IP头,构造TCP包,这样效果就
更好了
 
s估计是一个套接字数组
 
张无忌
我用了select函数,但是他设置的超时好像无效,当connect一个不开放的端口或者无效的
主机时,返回的速度简直是在做恶梦!
 
你用 select函数的时候,超时设置的不对,我以前写过一个扫描的玩意,测试还是比较正常的
 
兄弟,你稍等,我写个select代码!你看看。我的qq:68341889
 
这样看看行不行
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 1;
FD_ZERO(FDSet);
FSocket.SocketHandle:=......
FD_SET(FSocket.SocketHandle, FDSet);
select(0, @FDSet, nil, nil, @TimeVal);

只要能设置超时,那就不用异步sock方式,设置的小一点就行了
 
张无忌说得对,s 是套接字数组,因为你可能同时扫描几台计算机.
 
你设置超时的部分有问题,正确的如下设置:Borland VCL代码
while not Terminated and ClientSocket.Connected do
begin
FD_ZERO(FDSet);
FD_SET(ClientSocket.SocketHandle, FDSet);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
if (select(0, @FDSet, nil, nil, @TimeVal) > 0) and not Terminated then
if ClientSocket.ReceiveBuf(FDSet, -1) = 0 then Break
else Synchronize(DoRead);
if (select(0, nil, @FDSet, nil, @TimeVal) > 0) and not Terminated then
Synchronize(DoWrite);
end;
 
我不是很明白!

张无忌,你能不能写个例子
 

TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500; //你设置的值太小了,而且我建议你在线程中调用select
 
tianhf:

我创建了tsocket数组。

但是if sk[n]=msg.WParam then 这句永远不会相等
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
967
import
I
后退
顶部