[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    не знаю..
    в таком виде:
    все работает!

    ЗЫ: shttp говорит bad request

    что за переменная "mstimeout"?
     
    #5241 [stranger], 4 Feb 2010
    Last edited: 4 Feb 2010
  2. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    я имею в виду что работает так как тебе надо..
     
    #5242 [stranger], 4 Feb 2010
    Last edited: 4 Feb 2010
  3. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    вот что говорит tcpview спустя 3 минуты:
    [​IMG]
    ты на какой сервер запросы шлешь?
    и чему равняется mstimeout?
     
  4. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    я имел в виду "апач или nginx или еще какой-то зверь.."
    апач сдох от 5 минут этих запросов, а shttp нормально работает!
     
  5. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    вот что получается:
    апач: сервер умирает сразу, на клиенте немерено открытых соединений
    апач + nginx, nginx - front-end: сервер держится чуть дольше за счет ограничения на кол-во подключений с одного хоста nginx`ом, но все равно падает, на клиенте немерено открытых соединений
    nginx: 2 соединения как на сервере, так и на клиенте, независимо от времени
    SHTTP: до 4-х соединений, как на сервере так и на клиенте

    вывод напрашивается сам собой.. даже не знаю что в этом случае делать.
     
  6. GlooK

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    Мейби у тебя в винде ограничение на 10 потоков?
     
  7. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Спсибо помогло, но оно добовляет исходник страницы, а как сделать чтобы просто текст был?
     
  8. GlooK

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    PHP:
    Memo1.Lines.Text := StrPage;
     
    1 person likes this.
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    заменить <br> на #13#10

    =\ это тебе не html
     
  10. BenZeR

    BenZeR New Member

    Joined:
    18 Feb 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Code:
    procedure TForm1.startClick(Sender: TObject);
    begin
    for I := 0 to 1 do
    begin
      icqclient1.UIN:=uin2[i];
      icqclient1.Password:=pass2[i];
      icqclient1.Login();
      icqclient1.ChangePassword('ipc');
      icqclient1.LogOff;
      ShowMessage('ok');
    end;
    end;
    
    Собственно вопрос, почему не коннектится к серверу и не меняет пасс?
    //юзаю TICQClient
     
  11. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Попробуй из CreateThread вызывать свою функцию (в цикле while (если бесконечно требуется куда то слать пакеты))(ибо была такая же проблема (программа висла (а не перезагр. комп.)))

    На счет будет ли нагружать комп. -> не знаю
     
    #5251 wolmer, 5 Feb 2010
    Last edited: 5 Feb 2010
  12. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Хорошо, если winsock+while открывает так много соединений, то просто пиши код чтобы ждал завершения функции и начинал заного с функции (больше не знаю как помочь):
    Пиши в uses -> SYNCOBJS

    Заводи переменную cs:TCriticalSection;
    (на всю программу)
    (и в formcreate пиши -> cs:=tcriticalsection.create;)

    Ты вызываешь функцию в while цикле как я понял, верно? Если да то код должен был примерно таким:
    Code:
    while true do
     begin
      fWSRecv('localhost',
    'GET /log/ass.php' + #13#10 +
    'Host: localhost' + #13#10 +
    'User-Agent: Mozilla/5.0' + #13#10 +
    'Accept: text/html' + #13#10 +
    'Accept-Language: ru' + #13#10 +
    'Accept-Charset: windows-1251' + #13#10 +
    'Connection: close' + #13#10#13#10);
     end;
    Теперь берешь и дополняешь его:
    Code:
    while true do
     begin
      cs.Enter;
      fWSRecv('localhost',
    'GET /log/ass.php' + #13#10 +
    'Host: localhost' + #13#10 +
    'User-Agent: Mozilla/5.0' + #13#10 +
    'Accept: text/html' + #13#10 +
    'Accept-Language: ru' + #13#10 +
    'Accept-Charset: windows-1251' + #13#10 +
    'Connection: close' + #13#10#13#10);
      cs.Leave;
     end;
    Тем самым он будет ждать пока функция завершится, как она завершилась -> стартует заного! (или же попробуй еще cs.Leave; поставить в конце функции (если выше приведенный код -> не канает))

    По другому -> увы не знаю как сделать
     
    #5252 wolmer, 5 Feb 2010
    Last edited: 5 Feb 2010
    1 person likes this.
  13. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    может конечно мой вопрос не корректен, так как не было времени особо разбирать функцию, но не лучше ли вставлять бесконечный цикл уже в самой функции, после открытия соединения и перед закрытием?

    Code:
    function fWSRecv(wHost, wRequest: string):string;
    var
    hSocket: TSocket;
    hHost: PHostEnt;
    hAddr: TSockAddrIn;
    hTimeout: TTimeVal;
    iRead: integer;
    hBuffer: array[0..buffsize] of char;
    begin
    
     hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     hHost := gethostbyname(PChar(wHost));
     hAddr.sin_family := AF_INET;
     hAddr.sin_port := htons(80);
     hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
     hTimeout.tv_usec := 0;
     hTimeout.tv_sec := mstimeout;
     setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
     connect(hSocket, hAddr, SizeOf(hAddr));
     
    while (TRUE) do
     begin // МММ??
     Send(hSocket, wRequest[1], length(wRequest), 0);
      FillChar(hBuffer, SizeOf(hBuffer), 0);
      iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
    //  hData := hData + copy(hBuffer, 0, iRead);
      if (iRead <= 0) then break;
     end;
     CloseSocket(hSocket);
    //result := hData;
    end;
    
     
    1 person likes this.
  14. GlooK

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    Ну так вопрос решен?
     
  15. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Вот самописная (ибо маленько не понимаю как функция у тебя работает):
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Winsock, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      hworktread:THandle;
    
    implementation
    
    {$R *.dfm}
    
    procedure GetHost();
    var
     addr:sockaddr_in;
     sock:tsocket;
    
     send1:string;
     send1buffer, recv1buffer:array [1..4096] of char;
     dsize:dword;
    begin
     sock:=socket(af_inet, sock_stream, 0);
     addr.sin_family:=AF_INET;
     addr.sin_addr.S_addr:=inet_addr('94.103.89.31');
     addr.sin_port:=htons(80);
     form1.Memo1.Clear;
    
     if connect(sock, addr, sizeof(addr))=0 then
      begin
        send1:='GET http://pr-cy.ru/ HTTP/1.0'+#13#10+
    'User-Agent: Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.20'+#13#10+
    'Host: pr-cy.ru'+#13#10+
    'Cookie: 1=1;'+#13#10+
    'Cookie2: $Version=1'+#13#10+
    'Connection: Keep-Alive'+#13#10+#13#10;
        CopyMemory(@send1buffer, pchar(send1), length(send1));
        send(sock, send1buffer, sizeof(send1buffer), 0);
        repeat
          dSize:=recv(sock, recv1buffer, 4096, 0);
          Application.ProcessMessages; //В ЭТОЙ СТРОКЕ -> ВСЯ ФИШКА, ЕСЛИ ЕЕ УБРАТЬ, ПРОГРАММА ЗАВИСНЕТ
          form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+recv1buffer;
        until (dSize = 0) or (dSize = SOCKET_ERROR);
      end;
     closesocket(sock);
     form1.Label1.Caption:=inttostr(strtoint(form1.Label1.Caption)+1);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
     dummy:Cardinal;
     i:integer;
    begin
     while true do
      begin
        gethost;
      end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
     ws:wsadata;
    begin
     WSAStartup($101, ws);
    end;
    
    end.
    Работает нормально

    //Переделаешь как тебе нужно, думаю не составит проблем
     
    #5255 wolmer, 5 Feb 2010
    Last edited: 5 Feb 2010
  16. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Code:
    var i:integer;
    ...................
    connect(hSocket, hAddr, SizeOf(hAddr));
    
    for i:=0 to 2147483646 do begin
    Send(hSocket, wRequest[1], length(wRequest), 0);
    sleep(10);
    end;
     
      FillChar(hBuffer, SizeOf(hBuffer), 0);
      iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
    //  hData := hData + copy(hBuffer, 0, iRead);
      if (iRead <= 0) then break;
     CloseSocket(hSocket);
    
    сколько раз отошлет?
    поэксперементируй с задержкой...
     
  17. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    а вот так уже делать не правильно (если не ошибаюсь)
     
    #5257 wolmer, 5 Feb 2010
    Last edited: 5 Feb 2010
  18. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    почему?
     
  19. cLauZ

    cLauZ Member

    Joined:
    22 Oct 2009
    Messages:
    328
    Likes Received:
    27
    Reputations:
    5
    Есть откомп. дельфийский файл в exe , исходников нету=(
    Нада сменить кнопочку...точнее надпись на ней...ресурс хакер не помог...
    Как мне ент сделать?!народ нужно срочно до утра!!!
     
  20. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    попробуй winhex
     
Thread Status:
Not open for further replies.