BonjourExample.cpp [plain text]
#include "stdafx.h"
#include <assert.h>
#include <stdio.h>
#include "dns_sd.h"
#define BONJOUR_EVENT ( WM_USER + 0x100 ) // Message sent to the Window when a Bonjour event occurs.
static LRESULT CALLBACK WndProc( HWND inWindow, UINT inMsg, WPARAM inWParam, LPARAM inLParam );
static void DNSSD_API
BrowserCallBack(
DNSServiceRef inServiceRef,
DNSServiceFlags inFlags,
uint32_t inIFI,
DNSServiceErrorType inError,
const char * inName,
const char * inType,
const char * inDomain,
void * inContext );
DNSServiceRef gServiceRef = NULL;
int _tmain( int argc, _TCHAR *argv[] )
{
HINSTANCE instance;
WNDCLASSEX wcex;
HWND wind;
MSG msg;
DNSServiceErrorType err;
(void) argc; (void) argv;
instance = GetModuleHandle( NULL );
assert( instance );
wcex.cbSize = sizeof( wcex );
wcex.style = 0;
wcex.lpfnWndProc = (WNDPROC) WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = instance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT( "BonjourExample" );
wcex.hIconSm = NULL;
RegisterClassEx( &wcex );
wind = CreateWindow( wcex.lpszClassName, wcex.lpszClassName, 0, CW_USEDEFAULT, 0, CW_USEDEFAULT,
0, NULL, NULL, instance, NULL );
assert( wind );
err = DNSServiceBrowse(
&gServiceRef, 0, kDNSServiceInterfaceIndexAny, "_http._tcp", NULL, BrowserCallBack, NULL ); assert( err == kDNSServiceErr_NoError );
err = WSAAsyncSelect( (SOCKET) DNSServiceRefSockFD( gServiceRef ), wind, BONJOUR_EVENT, FD_READ | FD_CLOSE );
assert( err == kDNSServiceErr_NoError );
fprintf( stderr, "Browsing for _http._tcp\n" );
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
if( gServiceRef )
{
WSAAsyncSelect( (SOCKET) DNSServiceRefSockFD( gServiceRef ), wind, BONJOUR_EVENT, 0 );
DNSServiceRefDeallocate( gServiceRef );
}
return( 0 );
}
static LRESULT CALLBACK WndProc( HWND inWindow, UINT inMsg, WPARAM inWParam, LPARAM inLParam )
{
LRESULT result;
DNSServiceErrorType err;
switch( inMsg )
{
case BONJOUR_EVENT:
err = DNSServiceProcessResult( gServiceRef );
if( err != kDNSServiceErr_NoError )
{
fprintf( stderr, "### ERROR! serious Bonjour error: %d\n", err );
WSAAsyncSelect( (SOCKET) DNSServiceRefSockFD( gServiceRef ), inWindow, BONJOUR_EVENT, 0 );
DNSServiceRefDeallocate( gServiceRef );
gServiceRef = NULL;
PostQuitMessage( 0 );
}
result = 0;
break;
default:
result = DefWindowProc( inWindow, inMsg, inWParam, inLParam );
break;
}
return( result );
}
static void DNSSD_API
BrowserCallBack(
DNSServiceRef inServiceRef,
DNSServiceFlags inFlags,
uint32_t inIFI,
DNSServiceErrorType inError,
const char * inName,
const char * inType,
const char * inDomain,
void * inContext )
{
(void) inServiceRef; (void) inContext;
if( inError == kDNSServiceErr_NoError )
{
const char * action;
const char * more;
if( inFlags & kDNSServiceFlagsAdd ) action = "ADD";
else action = "RMV";
if( inFlags & kDNSServiceFlagsMoreComing ) more = " (MORE)";
else more = "";
fprintf( stderr, "%s %30s.%s%s on interface %d%s\n", action, inName, inType, inDomain, (int) inIFI, more );
}
else
{
fprintf( stderr, "Bonjour browser error occurred: %d\n", inError );
}
}