- '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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user