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:
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.
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();
}
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.