UDP таймаут или что-то подобное

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 13 Dec 2008.

  1. fire64

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

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Я написал плагин для сканера Angry IP Scanner для определения игровых серверов half life

    но столкнулся с проблемой

    В UDP протоколе же отсутствует соединение с другим компьютером, а следовательно и таймаута.

    Если другой компьютер не ответит функция не завершится

    подскажите как сделать таймаут в UDP

    вот код плагина

    PHP:
    // web_detect.cpp : Defines the entry point for the DLL application.
    //

    #include<stdio.h>
    #include<string.h>
    #include<winsock2.h>
    #include<windows.h>
    #include "plugin.h"

    #define PLUGIN_NAME            "HL Detect"
    #define    PLUGIN_DESCRIPTION    "HL Detect 1.0\nThis plugin detects which Half-Life Server is runnning on remote machines."
    #define    PLUGIN_AUTHOR        "fire64"
    #define    PLUGIN_WEBSITE        "http://csmania.ru/"

    #define UNKNOWN_SERVER                "Has a server"


    #define NOT_SERVER                "N/A"



    #define PORT  27015
    #define FRMSG "\xFF\xFF\xFF\xFF\TSource Engine Query\x00"

    //
    // Info function
    //
    extern "C" __declspec(dllexportBOOL Info(TInfoStruct *pInfoStruct)
    {    
        
    // Check that the struct is not older than we are expecting
        
    if (pInfoStruct->nStructSize sizeof(pInfoStruct))
            return 
    FALSE;

        
    // Initialize structure
        
    pInfoStruct->nAngryIPScannerVersion 216;        // Minimum version for this plugin to work
        
    pInfoStruct->nPluginType PLUGIN_TYPE_COLUMN;    // This plugin will appear as a new column for scanning
        
    strncpy((char*)&pInfoStruct->szPluginNamePLUGIN_NAMEsizeof(pInfoStruct->szPluginName)); // Initialize column name
        
    strncpy((char*)&pInfoStruct->szDescriptionPLUGIN_DESCRIPTIONsizeof(pInfoStruct->szDescription)); // Initialize description
        
    strncpy((char*)&pInfoStruct->szAuthorNamePLUGIN_AUTHORsizeof(pInfoStruct->szAuthorName)); 
        
    strncpy((char*)&pInfoStruct->szPluginWebsitePLUGIN_WEBSITEsizeof(pInfoStruct->szPluginWebsite)); 

        return 
    TRUE;    // We have initialized structure successfully
    }

    //
    // Options function
    //
    extern "C" __declspec(dllexportBOOL Options(HWND hwndParent)
    {    
        
    // This function must show a dialog box to user with
        // some options. As we don't have any options in this plugin
        // we could just omit this function, but we will show a MessageBox
        // instead to remind that this function could exist

        
    MessageBox(hwndParent"This plugin doesn't have any options yet!""Web Detect Plugin"MB_ICONHAND MB_OK);

        return 
    TRUE;
    }

    //
    // Init function
    //
    extern "C" __declspec(dllexportBOOL Init()
    {
        
    // This is a initialization function
        // It must be used to allocate internal memory
        // or do any other initialization stuff.
        
        // Winsock is initialized by Angry IP Scanner itself,
        // so we don't need to do this here

        
    return TRUE;    // Plugin will be rejected if it returns FALSE on initialization
    }

    //
    // Finalize function
    //
    extern "C" __declspec(dllexportBOOL Finalize()
    {
        
    // This is a finalize function
        // It must be used to free any previously 
        // allocated memory or do any other finalization    
        
        // We don't need any finalization 

        
    return TRUE;
    }

    //
    // Case-insensitive strstr()
    //
    char *stristr(char *str1char *str2)
    {
        
    char *ptr1, *ptr2;

        if (
    str1 == NULL)
            return 
    NULL;
        if (
    str2 == NULL)
            return 
    str1;

        while (*(
    ptr1 str1)) 
        {
            for (
    ptr2=str2; *ptr1 && *ptr2 && tolower(*ptr1)==tolower(*ptr2); ptr1++, ptr2++);

            if (*
    ptr2 == 0)
                return 
    str1;

            
    str1++;
        }
        return 
    NULL;
    }

    // 
    // Function that returns smallest number, greater than 0
    //
    charminPositive(characharb)
    {
        if (
    <= 0)
            return 
    b;
        else
        if (
    <= 0)
            return 
    a;
        else
            return 
    min(ab);
    }


    void parseServerName(LPSTR szResponseint nLength)
    {


        if ( 
    nLength 12)
        {

            
    strncpy(szResponseUNKNOWN_SERVERnLength);
            return;
        }

        else 
            
        {

            
    strncpy(szResponseNOT_SERVER30);

        }

    }



    //
    // The Scan function
    //
    extern "C" __declspec(dllexportBOOL Scan(DWORD nIPLPSTR szReturnint nBufferLen)
    {

            
        
    WSADATA wsaData;
        
    int  BufLen 10024;
        
    char RecvBuf[10024];

        if (
    WSAStartup(MAKEWORD(2,2), &wsaData))
        {
            
    printf  (" WSAStartup     error:   %d\n "WSAGetLastError ( ) );
            return  -
    1;
        }

        
    SOCKET  name_sock=socket AF_INETSOCK_DGRAMIPPROTO_UDP );

        if   ( 
    name_sock==INVALID_SOCKET )
        {
            
    printf (" socket ( ) error: %d \n "WSAGetLastError ( ) );
            
    WSACleanup ( );
            return -
    1;
        }

        
    sockaddr_in  dest_addr;
        
    dest_addr.sin_family=AF_INET;
        
    dest_addr.sin_port=htons PORT );
        
    dest_addr.sin_addr.s_addr nIP;

        
    int poketsizeof FRMSG )-1;
        
    sendto(name_sockFRMSGpoket0,(sockaddr  *)  &dest_addrsizeof(dest_addr));
        
    sockaddr_in   server_addr;
        
    int server_addr_size=sizeof (server_addr);

        
    char szResponse[512];

        
    char *szBufferPointer = (char*) &szResponse;
        
        
        
    int nNumRead recvfrom (name_sockRecvBufsizeof(RecvBuf),0,(sockaddr  *) &server_addr, &server_addr_size);

        
    closesocket (name_sock);

        
    parseServerName((char*) &szResponsenNumRead);

        
    _snprintf(szReturnnBufferLenszResponse);    
        

        return 
    TRUE;
    }
     
  2. Peklots

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

    Joined:
    28 Sep 2008
    Messages:
    281
    Likes Received:
    144
    Reputations:
    36
    ыы,
    Я гдет его уже видел xDD
     
  3. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    запускаем счетчик-таймера в отдельной нитке через секунду значение инкрементируется.... каждый новый пакет обнуляет счетчик, при достижении счетчиком определенного значения сигнализируем о тайм ауте....

    в твоем случае порождаем нитку с посылкой множественных пакетов с одного порта а получать будешь все подрят.... кто то не ответит(мы и не беспокоимся о них)
     
    #3 Delimiter, 13 Dec 2008
    Last edited: 13 Dec 2008
    1 person likes this.