From 487882dbff727bb1d5bb72fa8552aefc8124c1b5 Mon Sep 17 00:00:00 2001 From: miha_vitorovic Date: Mon, 10 Jan 2011 16:13:23 +0100 Subject: [PATCH] - '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. --- pvAccessApp/utils/inetAddressUtil.cpp | 16 +++++++++++++++- pvAccessApp/utils/inetAddressUtil.h | 8 ++++++-- testApp/utils/inetAddressUtilsTest.cpp | 4 ++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/pvAccessApp/utils/inetAddressUtil.cpp b/pvAccessApp/utils/inetAddressUtil.cpp index 7eeb41c..baded12 100644 --- a/pvAccessApp/utils/inetAddressUtil.cpp +++ b/pvAccessApp/utils/inetAddressUtil.cpp @@ -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); } diff --git a/pvAccessApp/utils/inetAddressUtil.h b/pvAccessApp/utils/inetAddressUtil.h index ee7f381..e8ee082 100644 --- a/pvAccessApp/utils/inetAddressUtil.h +++ b/pvAccessApp/utils/inetAddressUtil.h @@ -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. diff --git a/testApp/utils/inetAddressUtilsTest.cpp b/testApp/utils/inetAddressUtilsTest.cpp index 8594254..3ceae49 100644 --- a/testApp/utils/inetAddressUtilsTest.cpp +++ b/testApp/utils/inetAddressUtilsTest.cpp @@ -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: "<size()<size(); i++) { cout<<"Broadcast address: "; - cout<at(i), false)<at(i))<