Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: So 22.11.09 15:06 
Hi,
ich habe mir mal nen Portscanner für das lokale Netz geschrieben, mit dem ich erreichbare Ports herausfinden will.
Das ganze habe ich erst mit conenct versucht, aber der Timeout dort ist doch schon extrem.
Also meine derzeitige variante:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
    FSocket := socket(AF_INET,SOCK_STREAM,IPProto_TCP);
    if(FSocket = INVALID_SOCKET) then begin
    end else begin
      NonBlock:=1;
      {$IFNDEF Connect}
      IOCtlSocket(FSocket,FIONBIO,NonBlock);
      {$ENDIF}
      SockAddr.sin_family := AF_Inet;
      SockAddr.sin_port := htons(Ranges[j].Port);
      SockAddr.sin_addr.S_addr := htonl(Ranges[j].fIP+cur);
      {$IFDEF Connect}
      if(Connect(FSocket, SockAddr, SizeOf(SockAddr))<>SOCKET_ERROR) then begin
        AddList(Ranges[j].fIP+cur,Ranges[j].Port);
      end;
      {$ELSE}
      Connect(FSocket, SockAddr, SizeOf(SockAddr));
      timeout.tv_sec:=15;
      timeout.tv_usec:=0;
      FD_ZERO(readFDS);
      FD_SET(FSocket,readFDS);
      FD_ZERO(writeFDS);
      FD_SET(FSocket,writeFDS);
      res:=Select(FSocket+1,@readFDS,@writeFDS,nil,@timeout);
      if(res>0then begin
        //shutdown(FSocket,SD_RECEIVE);
        AddList(Ranges[j].fIP+cur,Ranges[j].Port);
      end;
      {$ENDIF}
      CloseSocket(FSocket);
    end;


das ganze läuft in 200 Threads (oder weniger)

jetzt 2 Fragen:
1) das shutdown (auskommentiert) habe ich in nem andren Programm gesehn. lt. msdn ist es aber unnötig, da danach ein closesocket kommt. habe ich das richtig verstanden?

2) Habe ich das problem dass wenn ich viele IPs scanne der anscheinend die letzten falsch wertet.
Bsp:
hab nen HTTP server auf 192.168.178.33 und 192.168.178.254
bei nem scan von 192.168.178.0-192.168.178.255 findet er den 33er, aber den bei 254er nicht
starte ich den scan bei 192.168.177.0 findet er beide nicht
starte ich bei 192.168.177.100 findet er den 33er

beim probieren scheint alles ab 192.168.177.31 den 33er zu finden und darunter nicht

woran liegt das?
wenn ich das timeout hochsetze findet er die wieder