UPnP открытие в с ++? - PullRequest
       59

UPnP открытие в с ++?

1 голос
/ 17 мая 2011

Я пытаюсь реализовать UpNp в приложении C ++, я нашел этот код с помощью Google:

BOOL upnp_discover( upnp_device_t* Device, ushort Tries )
{
    SOCKET              Sock;
    struct sockaddr_in  Addr;
    char                Buffer[1450],
                       *Begin   = NULL,
                       *End     = NULL;
    int                 i       = 0,
                        t       = 0,
                        Ret     = 0,
                        TrueLen = sizeof(bool);
    bool                True    = true;
    ulong               One     = 1,
                        Zero    = 0;
    Sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
    memset( &Addr, 0, sizeof(Addr) );
    Addr.sin_family      = AF_INET;
    Addr.sin_port        = htons( upnp_broadcast_port );
    Addr.sin_addr.s_addr = inet_addr( upnp_broadcast_ip );
    Ret = setsockopt( Sock, SOL_SOCKET, SO_BROADCAST, (char*)&True, TrueLen );
    for( i = 0; i < Tries; ++i )
    {
        memset( &Buffer, 0, sizeof(Buffer) );
        strcpy( Buffer, upnp_search_request );
        sendto( Sock, Buffer, strlen(Buffer), 0, (struct sockaddr*)&Addr, sizeof(Addr) );
        for( t = 0; t < 10; ++t )
        {
            ioctlsocket( Sock, FIONBIO, &One );
            memset( &Buffer, 0, sizeof(Buffer) );
            Ret = recvfrom( Sock, Buffer, (sizeof(Buffer) - 1), 0, NULL, NULL );
            if( Ret == SOCKET_ERROR)
            {
                Sleep( 1000 );
                continue;
            } else {
                Begin = strstr( Buffer, "http://" );
                if( Begin != NULL )
                {
                    End = strchr( Begin, '\r' );
                    if( End != NULL )
                    {
                        *End = '\0';
                        strncpy( Device->Location, Begin, (sizeof(Device->Location) - 1) );
                        upnp_parse_url( Device );
                        closesocket( Sock );
                        return TRUE;
                    }
                }
            }
        }
        ioctlsocket( Sock, FIONBIO, &Zero );
    }
    closesocket( Sock );
    return FALSE;
}

Но он всегда возвращает false, и я за маршрутизатором с включенным UPnP. Я нашел несколько других источников в Google, но они слишком зависимы от остальной части приложения, к которому они принадлежат, и, поскольку я немного новичок в C ++, я едва могу понять их.

Есть ли у кого-нибудь простой пример использования UpNP в c ++?


EDIT:

Отладка показывает, что:

Ret = recvfrom( Sock, Buffer, (sizeof(Buffer) - 1), 0, NULL, NULL );

Всегда -1 (SOCKET_ERROR), кто-нибудь знает, почему это происходит?

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

Интересно, не хотите ли вы воспользоваться существующими UPnP API в Windows?

Назначение

Инфраструктура UPnP ™ обеспечивает динамическое сетевое взаимодействие интеллектуальных приборы, беспроводные устройства и ПК. Есть два API для работы с устройствами, сертифицированными UPnP:

The Control Point API, which consists of a set of COM interfaces used to find and control devices.
The Device Host API, which consists of a set of COM interfaces used to implement devices that are hosted by a computer.
0 голосов
/ 08 января 2013

Здесь также есть бесплатная библиотека UPnP, предназначенная для переадресации портов на домашние NAT: http://miniupnp.free.fr/

0 голосов
/ 13 октября 2011

Вы можете посмотреть по этой ссылке исходный код, связанный с UPnP

...