На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> TcpClient , как через него реализовать timeout
    Вообщем вот что мне надо.
    Пишу я такую функцию: определение Ip компов в сети у которых открыт определённый порт. Пишу юзая компонент tcpClient. Как мне реализовать через этот компонент timeout сервера. Или допустим если компа с каким-то Ip вообще в сети нет, он долго тупит, пытая с кему подцепиться. Как мне всё это реализовать, чтобы функция быстрее работала? Заранее спасибо!
      В настройках компонента должно быть
        С tspClient не знаю, но так можно:

        type
          TCMSocketMessage = record
            Msg: Cardinal;
            Socket: TSocket;
            SelectEvent: Word;
            SelectError: Word;
            Result: Longint;
          end;

        var socks:integer;

        procedure TForm1.Button5Click(Sender: TObject);
        var tmp:integer;
        begin
        tmp:=strtoint(edit1.text);
        if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end;
          ipa[1]:=tmp;
          tmp:=strtoint(edit3.text);
        if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end;
          ipa[2]:=tmp;
          tmp:=strtoint(edit4.text);
        if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end;
          ipa[3]:=tmp;
          tmp:=strtoint(edit5.text);
        if tmp>255 then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end;
          ipa[4]:=tmp; st:=tmp;
          tmp:=strtoint(edit6.text);
        if (tmp>255)or(tmp<1) then begin messagedlg('Invalid IP!',mterror,[mbok],0); exit; end;
          en:=tmp;
          port:=StrToINT(Edit7.Text);
          ipi:=st;
          progressbar1.min:=st;
          progressbar1.max:=en;
          progressbar1.position:=st;
          ipscanactive:=true;
          timer1.enabled:=true;
        end;

        procedure TForm1.Timer1Timer(Sender: TObject);
        var skt:tsocket;
            sa:SockAddr_in;
        //    addr:in_addr;
            a:integer;
            estr:string;
        label showerror,cont;
        begin

        if ipscanactive=false then begin
        //    if socks=0 then begin
        //      wsacleanup;
        //      timer1.enabled:=false;
        //    end;
            exit;
          end;
          if socks>=255 then exit;

          skt:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
          sa.sin_port:=htons(port);
          ipa[4]:=ipi;
          sa.sin_addr.S_addr:=ip;
          sa.sin_family:=PF_INET;
          socks:=socks+1;
          wsaasyncselect(skt,form1.handle,WM_USER+1,FD_CONNECT or FD_READ);

          a:=connect(skt,sa,sizeof(sa));
          if a=-1 then begin
            a:=wsagetlasterror; estr:='';
            case a of
              WSAENETDOWN: begin estr:='Network subsystem is down'; goto showerror; end;
              WSAEADDRNOTAVAIL: begin estr:='IP is not available'; goto showerror; end;
              WSAEAFNOSUPPORT: begin estr:='IP is not supported'; goto showerror; end;
              WSAEFAULT: goto showerror;
              WSAENETUNREACH: begin estr:='Network cannot be reached'; goto showerror; end;
              WSAEHOSTUNREACH: begin estr:='Host cannot be reached'; goto showerror; end;
        // should be else - WSAENOBUFS: goto showerror;
              WSAEWOULDBLOCK: goto cont;
            else
              socks:=socks-1;
              closesocket(skt);
              exit;
            end;
        showerror:
            socks:=socks-1;
            closesocket(skt);
            stopscan;
            messagedlg('Connect error '+inttostr(a)+#10+estr+#10'Scan ended at '+iptostr(ip),mterror,[mbok],0);
            exit;
          end;
        cont:
          ipi:=ipi+1;
          if ipi>=en then begin stopscan; exit; end;
          progressbar1.Position:=ipi;
          //label9.caption:=inttostr(ipi);
        end;

        function Tform1.iptostr(p:cardinal):string;
        var pa:array[1..4] of byte absolute p;
        begin
          result:=inttostr(pa[1])+'.'+inttostr(pa[2])+'.'+inttostr(pa[3])+'.'+inttostr(pa[4]);
        end;

        procedure tform1.stopscan;
        begin
          timer1.enabled:=false;
          ipscanactive:=false;
          progressbar1.Position:=0;
         // button5.enabled:=true;
         // button6.caption:='Exit';
        // progressbar1.Max:=255;
         // progressbar1.Position:=progressbar1.Max;
         // label9.caption:='0';
        end;

        procedure Tform1.winsockevent(var msg:tcmsocketmessage);
        var sa:sockaddr_in;
            namelen:integer;
            tmp:string[20];
            host:PhostEnt;
        begin
          if msg.SelectError=0 then begin
                if msg.SelectEvent=FD_CONNECT then begin
                namelen:=sizeof(sa);
                getpeername(msg.Socket,sa,namelen);
                if (ipa[1]=127)and(ipa[2]=0) then lbnames.Items.add('localhost: Connected')
                else begin lbnames.Items.add(iptostr(sa.sin_addr.S_addr){+Inttostr(sa.sin_addr.S_un_w.s_w1)});
                //gethostbyaddr(sa.sin_addr.s_addr,sa.sin_addr.S_un_w,
                end;
             // end;
            end;
          end;
          closesocket(msg.socket);
          socks:=socks-1;
        end;


        взято здесь же на sources.ru(правда давно ссылочки не нашёл), поэтому выдирал из своей проги, мог какие-то переменные не дописать, разбирайся...
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0233 ]   [ 16 queries used ]   [ Generated: 28.04.24, 15:36 GMT ]