BroadCast.cpp
上传用户:popouu88
上传日期:2013-02-11
资源大小:2894k
文件大小:2k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. // BroadCast.cpp: implementation of the CBroadCast class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "BroadCast.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. #pragma comment( lib , "ws2_32.lib")
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. int CBroadCast::InitWSAStatup = 0;
  16. CBroadCast::CBroadCast()
  17. {
  18. this->sbroadcast = INVALID_SOCKET;
  19. this->nPort = 0;
  20. memset( &this->buffer , 0 , sizeof( this->buffer ) );
  21. if( ! CBroadCast::InitWSAStatup )
  22. {
  23. WSADATA data;
  24. ::WSAStartup( MAKEWORD( 2 , 2 ) , &data );
  25. }
  26. CBroadCast::InitWSAStatup ++;
  27. }
  28. CBroadCast::~CBroadCast()
  29. {
  30. CBroadCast::InitWSAStatup --;
  31. if( ! CBroadCast::InitWSAStatup )
  32. ::WSACleanup( );
  33. }
  34. int CBroadCast::Create( const int nPort )
  35. {
  36.     this->sbroadcast = ::socket( AF_INET, SOCK_DGRAM, 0 );
  37.     if( this->sbroadcast == INVALID_SOCKET )
  38. return 0;
  39.     
  40.     BOOL    fBroadcast = TRUE;
  41.     if( setsockopt( this->sbroadcast , SOL_SOCKET , SO_BROADCAST , ( char * )&fBroadcast , sizeof( BOOL ) ) == SOCKET_ERROR )
  42. {
  43. return 0;
  44. }
  45.     sockaddr_in addr;
  46. addr.sin_addr.s_addr = INADDR_ANY;
  47. addr.sin_family = AF_INET;
  48. addr.sin_port = ::htons( nPort ); 
  49.     if( bind( this->sbroadcast , ( SOCKADDR * )&addr , sizeof( addr ) ) == SOCKET_ERROR )
  50. {
  51. return 0;
  52.     }
  53. int len = sizeof( addr );
  54. ::getsockname( this->sbroadcast , ( SOCKADDR * )&addr , &len );
  55. this->nPort = ! nPort ? ntohs( addr.sin_port ): nPort;
  56. return this->nPort;
  57. }
  58. char * CBroadCast::Receive( int &size )
  59. {
  60. sockaddr_in addr;
  61. int len = sizeof( addr );
  62. size = ::recvfrom( this->sbroadcast , this->buffer , sizeof( this->buffer ) , 0 , ( SOCKADDR * )&addr , &len );
  63. if( size <= 0 )
  64. return NULL;
  65. return this->buffer;
  66. }
  67. bool CBroadCast::Send( const char * buffer , const int size )
  68. {
  69. sockaddr_in addr;
  70. addr.sin_addr.s_addr = ::inet_addr( "255.255.255.255" );
  71. addr.sin_family = AF_INET;
  72. addr.sin_port = ::htons( this->nPort ); 
  73. int len = sizeof( addr );
  74. return ::sendto( this->sbroadcast , buffer , size , 0 , ( SOCKADDR * )&addr , len ) >= size;
  75. }