Таймаут для gethostbyname C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 12 Jul 2010.

  1. fire64

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

    Joined:
    1 Apr 2008
    Messages:
    280
    Likes Received:
    22
    Reputations:
    5
    Как реализовать таймаут для функции gethostbyname ?
     
  2. AlexTheC0d3r

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

    Joined:
    25 Jul 2008
    Messages:
    451
    Likes Received:
    179
    Reputations:
    18
    т.е. ты хочешь чтобы она прерывалась по окончании тайм-аута?
     
  3. W!z@rD

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

    Joined:
    12 Feb 2006
    Messages:
    994
    Likes Received:
    289
    Reputations:
    43
    http://www.google.ru/search?hl=ru&source=hp&q=gethostbyname+async&aq=0&aqi=g1&aql=&oq=gethostbyname+as&gs_rfai=

    http://msdn.microsoft.com/en-us/library/ms741522(VS.85).aspx
     
  4. fire64

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

    Joined:
    1 Apr 2008
    Messages:
    280
    Likes Received:
    22
    Reputations:
    5
    AlexTheC0d3r, да именно это я и имел ввиду.

    W!z@rD, можно ссылку на пример использования WSAAsyncGetHostByName ?
     
  5. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    http://borland.xportal.ru/forum/viewtopic.php?t=1281&sid=2fa0f12ac02838fc09ece220457d8cbc
     
  6. fire64

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

    Joined:
    1 Apr 2008
    Messages:
    280
    Likes Received:
    22
    Reputations:
    5
    Ок
    отыскал в сети код, подогнал его под себя, однако он не работает :(


    Вызываю таким образом

    Code:
        IAsyncHostName *pBaseSocket = new IAsyncHostName( );
    
        pBaseSocket->AsyncGetHostByName( domain );
    
        Sleep( 1000 );
    
        struct hostent *hp = pBaseSocket->OnGetHostEnt( );
    
        delete pBaseSocket;
    
    однако WSAAsyncGetHostByName возвращает число ее вызовов, то есть при каждом вызове результат увеличивается на 1

    1, 2, 3 и т.д.

    а GetLastError() возвращает 0

    Код в архиве на народе
     
  7. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Это не число вызовов, а идентификатор. А возрастает т.к. не закрываются предыдущие задания.

    Что возвращает AsyncGetHostByName ? Есть подозрение что тут нужно == вместо !=
    Code:
    if (m_HostName.hTask != 0)
    	{
    		TRACE1("***** ERROR: WSAAsyncGetHostByName(%d) *****\n", GetLastError());
    		m_dwError = GetLastError();
    
    		return FALSE;
    	}
    И тут поменять:
    Code:
    	if (m_HostName.hTask == 0)
    	{
    		WSACancelAsyncRequest( m_HostName.hTask );
    	}
    > отыскал в сети код. Что за код, он рабочий?
     
    #7 keen6, 12 Jul 2010
    Last edited: 12 Jul 2010
  8. fire64

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

    Joined:
    1 Apr 2008
    Messages:
    280
    Likes Received:
    22
    Reputations:
    5
    Пока, что написал такой код:

    Code:
    struct hoststruct
    {
        char *domain;
        hostent *hp;
    };
    
    // âòîðîé ïîòîê
    UINT HostThread(LPVOID pParam) 
    {
        hoststruct *pHost = (hoststruct*)pParam;
    
        pHost->hp = gethostbyname(pHost->domain);
    
        return 0;
    }
    
    Вызываю так:

    Code:
        hoststruct *pHostInfo;
    
        ZeroMemory(pHostInfo, sizeof(hoststruct));
    
        pHostInfo->domain = domain;
    
        CWinThread* PHostThread;
    
        PHostThread = AfxBeginThread(HostThread, pHostInfo, THREAD_PRIORITY_NORMAL, 0, 0 , NULL );
    
        Sleep( 1000 );
    
        TerminateThread(PHostThread->m_hThread, 0);
    
        struct hostent *hp = pHostInfo->hp;
    
    Вопрос такой, какие последствия могут быть от подобного использования кода ?

    Пока нашел 2 минуса.

    при убийстве потока через TerminateThread, задание gethostbyname остается жить и соответственно все новые задания встают в очередь и при большом количестве заданий gethostbyname просто не срабатывает
     
    #8 fire64, 12 Jul 2010
    Last edited: 12 Jul 2010
  9. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Да, не самое лучшее решение. Действительно, скорее всего будет забиваться очередь. Хотя имхо WSAAsyncGetHostByName это тоже своеобразный подход к решению проблемы. :) А что с тем классом-то не получилось?
     
    #9 keen6, 12 Jul 2010
    Last edited: 12 Jul 2010
  10. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    А вообще посмотри вот это: http://sourceforge.net/projects/adns/
     
Loading...