From 0dcd5cb01710fee85fb50a05b9dd4603830f44a1 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 4 Jul 2002 18:41:13 +0000 Subject: [PATCH] Added support for Win32 broadcast and recience over lan. Changes sent in by Michael Gronager. --- src/Demos/osgcluster/broadcaster.cpp | 99 ++++++++++++++++++++-------- src/Demos/osgcluster/broadcaster.h | 16 ++++- src/Demos/osgcluster/osgcluster.cpp | 4 ++ src/Demos/osgcluster/receiver.cpp | 60 ++++++++++++++--- src/Demos/osgcluster/receiver.h | 22 +++++-- 5 files changed, 156 insertions(+), 45 deletions(-) diff --git a/src/Demos/osgcluster/broadcaster.cpp b/src/Demos/osgcluster/broadcaster.cpp index 6ee8bf48a..cc1ee3d7e 100644 --- a/src/Demos/osgcluster/broadcaster.cpp +++ b/src/Demos/osgcluster/broadcaster.cpp @@ -1,8 +1,9 @@ #include -#include #include -#include #include + +#if !defined (WIN32) +#include #include #include #include @@ -11,9 +12,12 @@ #include #include #include +#endif + #include #if defined(__linux) +#include # include #elif defined(__FreeBSD__) # include @@ -25,6 +29,9 @@ # include #elif defined (__DARWIN_OSX__) // added # include // added +#elif defined (WIN32) // added +# include // added +# include // added #else # error Teach me how to build on this system #endif @@ -43,50 +50,82 @@ Broadcaster::Broadcaster( void ) Broadcaster::~Broadcaster( void ) { +#if defined (WIN32) + closesocket( _so); +#else close( _so ); +#endif } bool Broadcaster::init( void ) { +#if defined (WIN32) + WORD version = MAKEWORD(1,1); + WSADATA wsaData; + // First, we start up Winsock + WSAStartup(version, &wsaData); +#endif + if( _port == 0 ) { - fprintf( stderr, "Broadcaster::init() - port not defined\n" ); - return false; + fprintf( stderr, "Broadcaster::init() - port not defined\n" ); + return false; } if( (_so = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) { - perror( "socket" ); - return false; + perror( "Socket" ); + return false; } +#if defined (WIN32) + const BOOL on = TRUE; +#else int on = 1; +#endif + +#if defined (WIN32) + setsockopt( _so, SOL_SOCKET, SO_REUSEADDR, (const char *) &on, sizeof(int)); +#else setsockopt( _so, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); +#endif saddr.sin_family = AF_INET; saddr.sin_port = htons( _port ); if( _address == 0 ) { - struct ifreq ifr; - setsockopt( _so, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); -#if defined (__linux) - strcpy( ifr.ifr_name, "eth0" ); -#elif defined(__sun) - strcpy( ifr.ifr_name, "hme0" ); +#if defined (WIN32) + setsockopt( _so, SOL_SOCKET, SO_BROADCAST, (const char *) &on, sizeof(int)); #else - strcpy( ifr.ifr_name, "ef0" ); + setsockopt( _so, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); #endif - if( (ioctl( _so, SIOCGIFBRDADDR, &ifr)) < 0 ) - { - perror( "Broadcaster::init() Cannot get Broadcast Address" ); - return false; - } - saddr.sin_addr.s_addr = ( - ((sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr); - } - else - { - saddr.sin_addr.s_addr = _address; + +#if !defined (WIN32) + struct ifreq ifr; +#endif +#if defined (__linux) + strcpy( ifr.ifr_name, "eth0" ); +#elif defined(__sun) + strcpy( ifr.ifr_name, "hme0" ); +#elif !defined (WIN32) + strcpy( ifr.ifr_name, "ef0" ); +#endif +#if defined (WIN32) // get the server address + saddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); } +#else + if( (ioctl( _so, SIOCGIFBRDADDR, &ifr)) < 0 ) + { + perror( "Broadcaster::init() Cannot get Broadcast Address" ); + return false; + } + saddr.sin_addr.s_addr = (((sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr); + } + else + { + saddr.sin_addr.s_addr = _address; + } +#endif +#define _VERBOSE 1 #ifdef _VERBOSE unsigned char *ptr = (unsigned char *)&saddr.sin_addr.s_addr; printf( "Broadcast address : %u.%u.%u.%u\n", ptr[0], ptr[1], ptr[2], ptr[3] ); @@ -121,7 +160,7 @@ void Broadcaster::setBuffer( void *buffer, const unsigned int size ) void Broadcaster::sync( void ) { - _initialized || init(); + if(!_initialized) init(); if( _buffer == 0L ) { @@ -129,9 +168,15 @@ void Broadcaster::sync( void ) return; } +#if defined (WIN32) + unsigned int size = sizeof( SOCKADDR_IN ); + sendto( _so, (const char *)_buffer, _buffer_size, 0, (struct sockaddr *)&saddr, size ); + int err = WSAGetLastError (); + int *dum = (int*) _buffer; +#else unsigned int size = sizeof( struct sockaddr_in ); - sendto( _so, (const void *)_buffer, _buffer_size, - 0, (struct sockaddr *)&saddr, size ); + sendto( _so, (const void *)_buffer, _buffer_size, 0, (struct sockaddr *)&saddr, size ); +#endif } diff --git a/src/Demos/osgcluster/broadcaster.h b/src/Demos/osgcluster/broadcaster.h index 8475619fa..32d84892d 100644 --- a/src/Demos/osgcluster/broadcaster.h +++ b/src/Demos/osgcluster/broadcaster.h @@ -7,7 +7,9 @@ // Class definition for broadcasting a buffer to a LAN // -#include +#ifndef WIN32 + #include +#endif class Broadcaster { @@ -34,12 +36,20 @@ class Broadcaster bool init( void ); private : +#if defined (WIN32) + SOCKET _so; +#else int _so; +#endif bool _initialized; short _port; void *_buffer; unsigned int _buffer_size; - struct sockaddr_in saddr; - unsigned long _address; +#if defined (WIN32) + SOCKADDR_IN saddr; +#else + struct sockaddr_in saddr; +#endif + unsigned long _address; }; #endif diff --git a/src/Demos/osgcluster/osgcluster.cpp b/src/Demos/osgcluster/osgcluster.cpp index a80b2a9e5..0b66cc3b9 100644 --- a/src/Demos/osgcluster/osgcluster.cpp +++ b/src/Demos/osgcluster/osgcluster.cpp @@ -17,6 +17,10 @@ #include +#if defined (WIN32) +#include +#endif + #include "receiver.h" #include "broadcaster.h" diff --git a/src/Demos/osgcluster/receiver.cpp b/src/Demos/osgcluster/receiver.cpp index d513d348d..c50481388 100644 --- a/src/Demos/osgcluster/receiver.cpp +++ b/src/Demos/osgcluster/receiver.cpp @@ -1,13 +1,17 @@ #include -#include #include #include +#if defined (WIN32) +#include +#else +#include #include #include #include #include #include #include +#endif #include @@ -22,34 +26,54 @@ Receiver::Receiver( void ) Receiver::~Receiver( void ) { +#if defined (WIN32) + closesocket( _so); +#else close( _so ); +#endif } bool Receiver::init( void ) { +#ifdef WIN32 + WORD version = MAKEWORD(1,1); + WSADATA wsaData; + // First, we start up Winsock + WSAStartup(version, &wsaData); +#endif + if( _port == 0 ) { - fprintf( stderr, "Receiver::init() - port not defined\n" ); - return false; + fprintf( stderr, "Receiver::init() - port not defined\n" ); + return false; } if( (_so = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) { - perror( "socket" ); - return false; + perror( "Socket" ); + return false; } +#if defined (WIN32) +// const BOOL on = TRUE; +// setsockopt( _so, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(int)); +#else int on = 1; setsockopt( _so, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); +#endif - struct sockaddr_in saddr; +// struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons( _port ); +#if defined (WIN32) + saddr.sin_addr.s_addr = htonl(INADDR_ANY); +#else saddr.sin_addr.s_addr = 0; +#endif if( bind( _so, (struct sockaddr *)&saddr, sizeof( saddr )) < 0 ) { perror( "bind" ); - return false; + return false; } _initialized = true; @@ -70,7 +94,7 @@ void Receiver::setBuffer( void *buffer, const unsigned int size ) void Receiver::sync( void ) { - _initialized || init(); + if(!_initialized) init(); if( _buffer == 0L ) { @@ -93,13 +117,29 @@ void Receiver::sync( void ) tv.tv_sec = 0; tv.tv_usec = 0; +#if defined (WIN32) +// saddr.sin_port = htons( _port ); + recvfrom( _so, (char *)_buffer, _buffer_size, 0, (sockaddr*)&saddr, &size ); +// recvfrom(sock_Receive, szMessage, 256, 0, (sockaddr*)&addr_Cli, &clilen) + int err = WSAGetLastError (); + int *dum = (int*) _buffer; + + while( select( _so+1, &fdset, 0L, 0L, &tv ) ) + { + if( FD_ISSET( _so, &fdset ) ) + { + recvfrom( _so, (char *)_buffer, _buffer_size, 0, (sockaddr*)&saddr, &size ); + } + } +#else recvfrom( _so, (caddr_t)_buffer, _buffer_size, 0, 0, &size ); while( select( _so+1, &fdset, 0L, 0L, &tv ) ) { if( FD_ISSET( _so, &fdset ) ) - { + { recvfrom( _so, (caddr_t)_buffer, _buffer_size, 0, 0, &size ); - } + } } +#endif } diff --git a/src/Demos/osgcluster/receiver.h b/src/Demos/osgcluster/receiver.h index 20597e6d7..f9043d106 100644 --- a/src/Demos/osgcluster/receiver.h +++ b/src/Demos/osgcluster/receiver.h @@ -8,6 +8,9 @@ // Class definition for the recipient of a broadcasted message // +#ifndef WIN32 + #include +#endif class Receiver { @@ -30,10 +33,19 @@ class Receiver bool init( void ); private : - int _so; - bool _initialized; - short _port; - void *_buffer; - unsigned int _buffer_size; +#if defined (WIN32) + SOCKET _so; +#else + int _so; +#endif +#if defined (WIN32) + SOCKADDR_IN saddr; +#else + struct sockaddr_in saddr; +#endif + bool _initialized; + short _port; + void *_buffer; + unsigned int _buffer_size; }; #endif