00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrcommon/net/BroadcastSocket.h"
00009
00010 namespace ibrcommon
00011 {
00012 BroadcastSocket::BroadcastSocket()
00013 : udpsocket(IPPROTO_UDP)
00014 {
00015 int b = 1;
00016 if ( ::setsockopt(_socket, SOL_SOCKET, SO_BROADCAST, (char*)&b, sizeof(b)) == -1 )
00017 {
00018 throw SocketException("BroadcastSocket: cannot send broadcasts");
00019 }
00020
00021
00022 setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&b, sizeof(b));
00023 }
00024
00025 BroadcastSocket::~BroadcastSocket()
00026 {
00027 }
00028
00029 void BroadcastSocket::bind(int port, const NetInterface &iface)
00030 {
00031
00032 _sockaddr.sin_port = htons(port);
00033
00034
00035 iface.getBroadcast(&_sockaddr.sin_addr);
00036
00037 if ( ::bind(_socket, (struct sockaddr *) &_sockaddr, sizeof(_sockaddr)) < 0 )
00038 {
00039 throw SocketException("BroadcastSocket: cannot bind socket");
00040 }
00041 }
00042
00043 void BroadcastSocket::bind(int port, std::string address)
00044 {
00045
00046 _sockaddr.sin_port = htons(port);
00047
00048
00049 if (address.length() > 0)
00050 {
00051 if (inet_pton(AF_INET, address.c_str(), &_sockaddr.sin_addr) <= 0)
00052 {
00053 throw SocketException("BroadcastSocket: can not parse address " + address);
00054 }
00055 }
00056
00057 if ( ::bind(_socket, (struct sockaddr *) &_sockaddr, sizeof(_sockaddr)) < 0 )
00058 {
00059 throw SocketException("BroadcastSocket: cannot bind socket");
00060 }
00061 }
00062 }