Quantcast
Channel: CodeGuru Forums - Visual C++ Programming
Viewing all articles
Browse latest Browse all 3029

SSDP Discovery not working SOAP uPnp

$
0
0
Hey Gurus,

I'm trying to write a routine to discover my Belkin Wemo devices in my house (light switches) using uPNP SSDP.

Here is my routine:

Code:

char *searchIGDevice = "M-SEARCH * HTTP/1.1\r\nHost:239.255.255.250:1900\r\nST:urn:Belkin:device:controllee:1\r\nMan:\"ssdp:discover\"\r\nMX:3\r\n\r\n";

char buf[ 512 ];

int result = -1;

WSADATA wsaData;

struct sockaddr_in upnpControl,        broadcast_addr;

result = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

if ( !result )
{
        SOCKET sock = INVALID_SOCKET;

        sock = socket( AF_INET, SOCK_DGRAM, 0 );

        if ( sock != INVALID_SOCKET )
        {
                if ( setsockopt( sock, SOL_SOCKET, SO_BROADCAST, searchIGDevice, sizeof( searchIGDevice ) ) != SOCKET_ERROR )
                {
                        upnpControl.sin_family = AF_INET;
                        upnpControl.sin_port = htons( 0 );
                        upnpControl.sin_addr.s_addr = INADDR_ANY;

                        if ( bind( sock, ( sockaddr* ) &upnpControl, sizeof( upnpControl ) ) != SOCKET_ERROR )
                        {
                                broadcast_addr.sin_family = AF_INET;
                                broadcast_addr.sin_port = htons( 1900 );
                                broadcast_addr.sin_addr.s_addr = inet_addr( "239.255.255.250" );

                                if ( sendto( sock, searchIGDevice, lstrlen( searchIGDevice ) + 1, 0, ( sockaddr * ) &broadcast_addr, sizeof( broadcast_addr ) ) != SOCKET_ERROR )
                                {
                                        int bcLen = sizeof( broadcast_addr );

                                        int bytes, count = 0;

                                        fd_set fds;
                                        int n;
                                        struct timeval tv;

                                        // Set up the file descriptor set.
                                        FD_ZERO( &fds );
                                        FD_SET( sock, &fds );

                                        // Set up the struct timeval for the timeout.
                                        tv.tv_sec = 5;
                                        tv.tv_usec = 0;

                                        do
                                        {
                                                // Wait until timeout or data received.
                                                n = select( sock, &fds, NULL, NULL, &tv );

                                                if ( n != 0 )
                                                {
                                                        ZeroMemory( buf, 512 );

                                                        bytes = recvfrom( sock, buf, 512, 0, ( sockaddr * ) &broadcast_addr, &bcLen );

                                                        // Need to copy out buf for later use.

                                                        count++;
                                                }

                                                else break;

                                        } while ( true );

                                        if ( count > 0 )
                                        {
                                                // Do stuff here if discovered.
                                        }
                                }
                        }
                }

                closesocket( sock );
        }

        WSACleanup();
}

I'm aware the above code has no error checking. This routine was working fine, and then it stopped working and I can't see what I have done wrong?

Could someone please have a look at this code and see what I am doing wrong?
Is there a better way of doing it?

Many thanks everyone,

Steve Q.

Viewing all articles
Browse latest Browse all 3029

Latest Images

Trending Articles



Latest Images