- 'getBroadcastAddresses' now accepts a port as parameter which in then used in all returned broadcast addresses.

- 'getBroadcastAddresses' now returns a default broadcast address (255.255.255.255) on failure, if no other broadcast address was found.
This commit is contained in:
miha_vitorovic
2011-01-10 16:13:23 +01:00
parent 6db84be16e
commit 487882dbff
3 changed files with 23 additions and 5 deletions

View File

@@ -32,10 +32,19 @@ using namespace epics::pvData;
namespace epics {
namespace pvAccess {
void addDefaultBroadcastAddress(InetAddrVector* v, in_port_t p) {
osiSockAddr* pNewNode = new osiSockAddr;
pNewNode->ia.sin_family = AF_INET;
pNewNode->ia.sin_addr.s_addr = htonl(INADDR_BROADCAST);
pNewNode->ia.sin_port = htons(p);
v->push_back(pNewNode);
}
/* port of osiSockDiscoverBroadcastAddresses() in
* epics/base/src/libCom/osi/os/default/osdNetIntf.c
*/
InetAddrVector* getBroadcastAddresses(SOCKET sock) {
InetAddrVector* getBroadcastAddresses(SOCKET sock,
in_port_t defaultPort) {
static const unsigned nelem = 100;
int status;
struct ifconf ifconf;
@@ -56,6 +65,7 @@ namespace epics {
if(!pIfreqList) {
errlogSevPrintf(errlogMajor,
"getBroadcastAddresses(): no memory to complete request");
addDefaultBroadcastAddress(retVector, defaultPort);
return retVector;
}
@@ -67,6 +77,7 @@ namespace epics {
errlogSevPrintf(errlogMinor,
"getBroadcastAddresses(): unable to fetch network interface configuration");
delete[] pIfreqList;
addDefaultBroadcastAddress(retVector, defaultPort);
return retVector;
}
@@ -117,6 +128,8 @@ namespace epics {
errlogSevPrintf(errlogMajor,
"getBroadcastAddresses(): no memory available for configuration");
delete[] pIfreqList;
if(retVector->size()==0) addDefaultBroadcastAddress(
retVector, defaultPort);
return retVector;
}
@@ -168,6 +181,7 @@ namespace epics {
delete pNewNode;
continue;
}
pNewNode->ia.sin_port = htons(defaultPort);
retVector->push_back(pNewNode);
}

View File

@@ -33,8 +33,12 @@ namespace epics {
/**
* returns a vector containing all the IPv4 broadcast addresses
* on this machine. IPv6 doesn't have a local broadcast address.
*/
InetAddrVector* getBroadcastAddresses(SOCKET sock);
* Conversion of the defaultPort to network byte order performed by
* the function.
* TODO: Windows implementation of the function.
*/
InetAddrVector* getBroadcastAddresses(SOCKET sock,
in_port_t defaultPort);
/**
* Encode IPv4 address as IPv6 address.

View File

@@ -129,11 +129,11 @@ int main(int argc, char *argv[]) {
cout<<"\nPASSED!\n";
SOCKET socket = epicsSocketCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP);
InetAddrVector* broadcasts = getBroadcastAddresses(socket);
InetAddrVector* broadcasts = getBroadcastAddresses(socket,6678);
cout<<"Broadcast addresses: "<<broadcasts->size()<<endl;
for(size_t i = 0; i<broadcasts->size(); i++) {
cout<<"Broadcast address: ";
cout<<inetAddressToString(broadcasts->at(i), false)<<endl;
cout<<inetAddressToString(broadcasts->at(i))<<endl;
}
delete broadcasts;