Обратботка ответов [Winsocks]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by FairHawk, 29 Jun 2010.

  1. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    Народ, получаю ответы от сервера через reсv в бесконечном цикле, но прога виснет, как это оптимизировать можно?
     
  2. POS_troi

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

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Подробнее чтоли раскажи. А темболее зачем в бесконечном? Заодно кусочек кода.
     
  3. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Recv, когда ожидает данные, то блокирует выполнение потока. Поэтому прожка и виснет.
     
  4. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    Code:
    Application.ProcessMessages;  
    while true  do begin
    recv(clientSocket, BUFER, Length(512),0);
    
     
  5. b0r2

    b0r2 Member

    Joined:
    29 Jun 2010
    Messages:
    30
    Likes Received:
    5
    Reputations:
    0
    Для recv() создай отдельный поток,для виндовс через
    CreateThread на Линукс с помощью функции pthread_create() или же пользуйся асинхронными сокетами.
     
  6. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    Не, поток не вариант.
    Нужно сделать что то типо события, если на сокет пришло что то, выполнить recv, как то так
     
    #6 FairHawk, 29 Jun 2010
    Last edited: 29 Jun 2010
  7. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Надо проверять что возвращяет recv ,если меньше 1 то break и WSAGetaLastError
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    народу, вам не надоело обсуждать каждый месяц одно и тоже?
    1) если это HTTP запросы. то не надо збывать про Connection: Close и Content-Length
    2) если хз какойто другой протокол, то после коннекта переводи сокет в неблокируемый режим и гоняй в цикле вместе с Application.ProcessMessages и небольшой паузой.
    илиже если неблокируемые не нравятся, то через select проверяй готовность сокета
     
  9. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    решил проблему так:
    Code:
    const
    WM_MYSOCKMESS= WM_USER+1;
    private
    procedure NetMSG (var M:TMessage); message WM_MYSOCKMESS;
    ...
    procedure TForm1.NetMSG(var M: TMessage);
    begin
    case m.LParam of
      FD_READ: begin
                recv(_clientSocket, sRecvBuff_5, 512,0);
                Memo1.Lines.Add(sRecvBuff_5);
                end;
      FD_CLOSE: CloseSocket(M.WParam);
    end;
    
    end;
    
    WSAAsyncSelect(_clientSocket, handle, WM_MYSOCKMESS, FD_READ);
    
    Думаю как теперь работу через проксю сделать.
    Может делал кто то подобное, подскажите какие запросы слать, викопедия пока не очень помогла)
     
    #9 FairHawk, 29 Jun 2010
    Last edited: 29 Jun 2010
  10. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    прокся - понятие растяжимое. Существует много видом проксей. Но почти для каждого вида есть своя RFC. Вот и ищи RFC по протоколу прокси, причем для Socks5, Socks4, HTTP, HTTPS - точно есть
     
  11. FairHawk

    FairHawk Member

    Joined:
    16 Mar 2010
    Messages:
    46
    Likes Received:
    6
    Reputations:
    0
    slesh ок, спс