inetAddressUtil no more new vector

no more allocating vector.
This commit is contained in:
Michael Davidsaver
2017-08-31 14:32:13 -05:00
parent 0f8865e1ea
commit 27ec187bd4
10 changed files with 131 additions and 128 deletions

View File

@ -2,6 +2,7 @@ TOP=..
include $(TOP)/configure/CONFIG
USR_CPPFLAGS += -I$(TOP)/src/utils
USR_CPPFLAGS += -I$(TOP)/src/remote
PROD_HOST += pvget

View File

@ -228,7 +228,8 @@ bool discoverServers(double timeOut)
int broadcastPort = configuration->getPropertyAsInteger("EPICS_PVA_BROADCAST_PORT", PVA_BROADCAST_PORT);
// quary broadcast addresses of all IFs
auto_ptr<InetAddrVector> broadcastAddresses(getBroadcastAddresses(socket, broadcastPort));
InetAddrVector broadcastAddresses;
getBroadcastAddresses(broadcastAddresses, socket, broadcastPort);
// set broadcast address list
if (!addressList.empty())
@ -236,18 +237,19 @@ bool discoverServers(double timeOut)
// if auto is true, add it to specified list
InetAddrVector* appendList = 0;
if (autoAddressList)
appendList = broadcastAddresses.get();
appendList = &broadcastAddresses;
auto_ptr<InetAddrVector> list(getSocketAddressList(addressList, broadcastPort, appendList));
if (list.get() && list->size()) {
InetAddrVector list;
getSocketAddressList(list, addressList, broadcastPort, appendList);
if (!list.empty()) {
// delete old list and take ownership of a new one
broadcastAddresses = list;
}
}
for (size_t i = 0; broadcastAddresses.get() && i < broadcastAddresses->size(); i++)
for (size_t i = 0; i < broadcastAddresses.size(); i++)
LOG(logLevelDebug,
"Broadcast address #%d: %s.", i, inetAddressToString((*broadcastAddresses)[i]).c_str());
"Broadcast address #%d: %s.", i, inetAddressToString(broadcastAddresses[i]).c_str());
// ---
@ -330,11 +332,11 @@ bool discoverServers(double timeOut)
sendBuffer.putShort((int16_t)0); // count
bool oneOK = false;
for (size_t i = 0; i < broadcastAddresses->size(); i++)
for (size_t i = 0; i < broadcastAddresses.size(); i++)
{
// send the packet
status = ::sendto(socket, sendBuffer.getArray(), sendBuffer.getPosition(), 0,
&((*broadcastAddresses)[i].sa), sizeof(sockaddr));
&broadcastAddresses[i].sa, sizeof(sockaddr));
if (status < 0)
{
char errStr[64];
@ -409,11 +411,11 @@ bool discoverServers(double timeOut)
{
// TODO duplicate code
bool oneOK = false;
for (size_t i = 0; i < broadcastAddresses->size(); i++)
for (size_t i = 0; i < broadcastAddresses.size(); i++)
{
// send the packet
status = ::sendto(socket, sendBuffer.getArray(), sendBuffer.getPosition(), 0,
&((*broadcastAddresses)[i].sa), sizeof(sockaddr));
&broadcastAddresses[i].sa, sizeof(sockaddr));
if (status < 0)
{
char errStr[64];

View File

@ -619,10 +619,11 @@ void initializeUDPTransports(bool serverFlag,
if (!autoAddressList)
autoBCastAddr.clear();
auto_ptr<InetAddrVector> list(getSocketAddressList(addressList, sendPort, &autoBCastAddr));
if (list.get() && list->size())
InetAddrVector list;
getSocketAddressList(list, addressList, sendPort, &autoBCastAddr);
if (!list.empty())
{
sendTransport->setSendAddresses(*list);
sendTransport->setSendAddresses(list);
}
/*
else
@ -667,9 +668,8 @@ void initializeUDPTransports(bool serverFlag,
//
// set ignore address list
//
auto_ptr<InetAddrVector> ignoreAddressVector;
if (!ignoreAddressList.empty())
ignoreAddressVector.reset(getSocketAddressList(ignoreAddressList, 0, 0));
InetAddrVector ignoreAddressVector;
getSocketAddressList(ignoreAddressVector, ignoreAddressList, 0, 0);
//
// Setup UDP trasport(s) (per interface)
@ -700,8 +700,7 @@ void initializeUDPTransports(bool serverFlag,
continue;
listenLocalAddress = *transport->getRemoteAddress();
if (ignoreAddressVector.get() && ignoreAddressVector->size())
transport->setIgnoredAddresses(*ignoreAddressVector);
transport->setIgnoredAddresses(ignoreAddressVector);
tappedNIF.push_back(listenLocalAddress);
@ -740,8 +739,7 @@ void initializeUDPTransports(bool serverFlag,
*/
// NOTE: search responses all always send from sendTransport
if (ignoreAddressVector.get() && ignoreAddressVector->size())
transport2->setIgnoredAddresses(*ignoreAddressVector);
transport2->setIgnoredAddresses(ignoreAddressVector);
tappedNIF.push_back(bcastAddress);
}

View File

@ -303,11 +303,10 @@ public:
return &_bindAddress;
}
bool isBroadcastAddress(const osiSockAddr* address, InetAddrVector *broadcastAddresses)
bool isBroadcastAddress(const osiSockAddr* address, const InetAddrVector& broadcastAddresses)
{
if (broadcastAddresses)
for (size_t i = 0; i < broadcastAddresses->size(); i++)
if ((*broadcastAddresses)[i].ia.sin_addr.s_addr == address->ia.sin_addr.s_addr)
for (size_t i = 0; i < broadcastAddresses.size(); i++)
if (broadcastAddresses[i].ia.sin_addr.s_addr == address->ia.sin_addr.s_addr)
return true;
return false;
}
@ -318,9 +317,10 @@ public:
*/
void setSendAddresses(const InetAddrVector& addresses) {
std::vector<bool> isuni(addresses.size(), false);
std::auto_ptr<InetAddrVector> broadcastAddresses(getBroadcastAddresses(_channel, 0));
InetAddrVector broadcastAddresses;
getBroadcastAddresses(broadcastAddresses, _channel, 0);
for(size_t i=0, N=addresses.size(); i<N; i++)
isuni[i] = !isBroadcastAddress(&addresses[i], broadcastAddresses.get())
isuni[i] = !isBroadcastAddress(&addresses[i], broadcastAddresses)
&& !isMulticastAddress(&addresses[i]);
_sendAddresses = addresses;
_isSendAddressUnicast.swap(isuni);

View File

@ -3129,13 +3129,8 @@ public:
short priority,
std::string const & addressesStr) OVERRIDE FINAL
{
auto_ptr<InetAddrVector> addresses;
if (!addressesStr.empty())
{
addresses.reset(getSocketAddressList(addressesStr, PVA_SERVER_PORT));
if (addresses->empty())
addresses.reset();
}
InetAddrVector addresses;
getSocketAddressList(addresses, addressesStr, PVA_SERVER_PORT);
Channel::shared_pointer channel = createChannelInternal(channelName, channelRequester, priority, addresses);
if (channel.get())
@ -3200,7 +3195,7 @@ public:
/**
* List of fixed addresses, if <code<0</code> name resolution will be used.
*/
auto_ptr<InetAddrVector> m_addresses;
InetAddrVector m_addresses;
/**
* @brief m_addressIndex Index of currently used address (rollover pointer in a list).
@ -3279,7 +3274,7 @@ private:
string const & name,
ChannelRequester::shared_pointer const & requester,
short priority,
auto_ptr<InetAddrVector>& addresses) :
const InetAddrVector& addresses) :
m_context(context),
m_channelID(channelID),
m_name(name),
@ -3315,7 +3310,7 @@ private:
string const & name,
ChannelRequester::shared_pointer requester,
short priority,
auto_ptr<InetAddrVector>& addresses)
const InetAddrVector& addresses)
{
std::tr1::shared_ptr<InternalChannelImpl> internal(
new InternalChannelImpl(context, channelID, name, requester, priority, addresses)),
@ -3680,14 +3675,14 @@ public:
m_allowCreation = true;
if (!m_addresses.get())
if (m_addresses.empty())
{
m_context->getChannelSearchManager()->registerSearchInstance(internal_from_this(), penalize);
}
else if (!m_addresses->empty())
else
{
m_context->getTimer()->scheduleAfterDelay(internal_from_this(),
(m_addressIndex / m_addresses->size())*STATIC_SEARCH_BASE_DELAY_SEC);
(m_addressIndex / m_addresses.size())*STATIC_SEARCH_BASE_DELAY_SEC);
}
}
@ -3695,14 +3690,15 @@ public:
// TODO cancellaction?!
// TODO not in this timer thread !!!
// TODO boost when a server (from address list) is started!!! IP vs address !!!
int ix = m_addressIndex % m_addresses->size();
int ix = m_addressIndex % m_addresses.size();
m_addressIndex++;
if (m_addressIndex >= static_cast<int>(m_addresses->size()*(STATIC_SEARCH_MAX_MULTIPLIER+1)))
m_addressIndex = m_addresses->size()*STATIC_SEARCH_MAX_MULTIPLIER;
if (m_addressIndex >= static_cast<int>(m_addresses.size()*(STATIC_SEARCH_MAX_MULTIPLIER+1)))
m_addressIndex = m_addresses.size()*STATIC_SEARCH_MAX_MULTIPLIER;
// NOTE: calls channelConnectFailed() on failure
static ServerGUID guid = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
searchResponse(guid, PVA_PROTOCOL_REVISION, &((*m_addresses)[ix]));
// m_addresses[ix] is modified by the following
searchResponse(guid, PVA_PROTOCOL_REVISION, &m_addresses[ix]);
}
virtual void timerStopped() OVERRIDE FINAL {
@ -4521,7 +4517,7 @@ private:
// TODO no minor version with the addresses
// TODO what if there is an channel with the same name, but on different host!
ChannelImpl::shared_pointer createChannelInternal(std::string const & name, ChannelRequester::shared_pointer const & requester, short priority,
auto_ptr<InetAddrVector>& addresses) OVERRIDE FINAL { // TODO addresses
const InetAddrVector& addresses) OVERRIDE FINAL { // TODO addresses
checkState();
checkChannelName(name);

View File

@ -103,7 +103,7 @@ public:
virtual ChannelImpl::shared_pointer createChannelInternal(std::string const &name,
ChannelRequester::shared_pointer const & requester,
short priority,
std::auto_ptr<InetAddrVector>& addresses) = 0;
const InetAddrVector& addresses) = 0;
virtual ResponseRequest::shared_pointer getResponseRequest(pvAccessID ioid) = 0;
virtual pvAccessID registerResponseRequest(ResponseRequest::shared_pointer const & request) = 0;

View File

@ -34,8 +34,10 @@ void addDefaultBroadcastAddress(InetAddrVector* v, unsigned short p) {
v->push_back(pNewNode);
}
InetAddrVector* getBroadcastAddresses(SOCKET sock,
void getBroadcastAddresses(InetAddrVector& ret,
SOCKET sock,
unsigned short defaultPort) {
ret.clear();
ELLLIST as;
ellInit(&as);
osiSockAddr serverAddr;
@ -47,13 +49,12 @@ InetAddrVector* getBroadcastAddresses(SOCKET sock,
osiSockAddrNode * sn = (osiSockAddrNode *)n;
sn->addr.ia.sin_port = htons(defaultPort);
// TODO discover possible duplicates
v->push_back(sn->addr);
ret.push_back(sn->addr);
}
ellFree(&as);
// add fallback address
if (!v->size())
if (!ret.size())
addDefaultBroadcastAddress(v, defaultPort);
return v;
}
void encodeAsIPv6Address(ByteBuffer* buffer, const osiSockAddr* address) {
@ -101,13 +102,10 @@ bool isMulticastAddress(const osiSockAddr* address) {
return msB >= 224 && msB <= 239;
}
osiSockAddr* intToIPv4Address(int32 addr) {
osiSockAddr* ret = new osiSockAddr;
ret->ia.sin_family = AF_INET;
ret->ia.sin_addr.s_addr = htonl(addr);
ret->ia.sin_port = 0;
return ret;
void intToIPv4Address(osiSockAddr& ret, int32 addr) {
ret.ia.sin_family = AF_INET;
ret.ia.sin_addr.s_addr = htonl(addr);
ret.ia.sin_port = 0;
}
int32 ipv4AddressToInt(const osiSockAddr& addr) {
@ -148,9 +146,10 @@ int32 parseInetAddress(const string & addr) {
return htonl(retAddr);
}
InetAddrVector* getSocketAddressList(const std::string & list, int defaultPort,
void getSocketAddressList(InetAddrVector& ret,
const std::string & list, int defaultPort,
const InetAddrVector* appendList) {
InetAddrVector* iav = new InetAddrVector();
ret.clear();
// skip leading spaces
size_t len = list.length();
@ -164,21 +163,20 @@ InetAddrVector* getSocketAddressList(const std::string & list, int defaultPort,
string address = list.substr(subStart, (subEnd-subStart));
osiSockAddr addr;
if (aToIPAddr(address.c_str(), defaultPort, &addr.ia) == 0)
iav->push_back(addr);
ret.push_back(addr);
subStart = list.find_first_not_of(" \t\r\n\v", subEnd);
}
if(subStart!=std::string::npos && subStart<len) {
osiSockAddr addr;
if (aToIPAddr(list.substr(subStart).c_str(), defaultPort, &addr.ia) == 0)
iav->push_back(addr);
ret.push_back(addr);
}
if(appendList!=NULL) {
for(size_t i = 0; i<appendList->size(); i++)
iav->push_back((*appendList)[i]);
ret.push_back((*appendList)[i]);
}
return iav;
}
string inetAddressToString(const osiSockAddr &addr,

View File

@ -24,12 +24,12 @@ namespace pvAccess {
typedef std::vector<osiSockAddr> InetAddrVector;
/**
* Returns a vector containing all the IPv4 broadcast addresses on this machine.
* Populate a vector containing all the IPv4 broadcast addresses on this machine.
* IPv6 doesn't have a local broadcast address.
* Conversion of the defaultPort to network byte order performed by
* the function.
*/
epicsShareFunc InetAddrVector* getBroadcastAddresses(SOCKET sock, unsigned short defaultPort);
epicsShareFunc void getBroadcastAddresses(InetAddrVector& ret, SOCKET sock, unsigned short defaultPort);
struct ifaceNode {
osiSockAddr ifaceAddr, ifaceBCast;
@ -66,10 +66,10 @@ epicsShareFunc bool isMulticastAddress(const osiSockAddr* address);
/**
* Convert an integer into an IPv4 INET address.
* @param ret address stored here
* @param addr integer representation of a given address.
* @return IPv4 INET address.
*/
epicsShareFunc osiSockAddr* intToIPv4Address(epics::pvData::int32 addr);
epicsShareFunc void intToIPv4Address(osiSockAddr& ret, epics::pvData::int32 addr);
/**
* Convert an IPv4 INET address to an integer.
@ -79,13 +79,14 @@ epicsShareFunc osiSockAddr* intToIPv4Address(epics::pvData::int32 addr);
epicsShareFunc epics::pvData::int32 ipv4AddressToInt(const osiSockAddr& addr);
/**
* Parse space delimited addresss[:port] string and return array of <code>InetSocketAddress</code>.
* Parse space delimited addresss[:port] string and populate array of <code>InetSocketAddress</code>.
* @param ret results stored hre
* @param list space delimited addresss[:port] string.
* @param defaultPort port take if not specified.
* @param appendList list to be appended.
* @return array of <code>InetSocketAddress</code>.
*/
epicsShareFunc InetAddrVector* getSocketAddressList(const std::string & list, int defaultPort,
epicsShareFunc void getSocketAddressList(InetAddrVector& ret, const std::string & list, int defaultPort,
const InetAddrVector* appendList = NULL);
epicsShareFunc std::string inetAddressToString(const osiSockAddr &addr,

View File

@ -3,6 +3,7 @@
TOP = ..
include $(TOP)/configure/CONFIG
USR_CPPFLAGS += -I$(TOP)/src/utils
USR_CPPFLAGS += -I$(TOP)/src/server
USR_CPPFLAGS += -I$(TOP)/src/remote
USR_CPPFLAGS += -I$(TOP)/src/remoteClient

View File

@ -21,24 +21,25 @@ void test_getSocketAddressList()
{
testDiag("Test getSocketAddressList()");
auto_ptr<InetAddrVector> vec(getSocketAddressList("127.0.0.1 10.10.12.11:1234 192.168.3.4", 555));
InetAddrVector vec;
getSocketAddressList(vec, "127.0.0.1 10.10.12.11:1234 192.168.3.4", 555);
testOk1(static_cast<size_t>(3) == vec->size());
testOk1(static_cast<size_t>(3) == vec.size());
osiSockAddr addr;
addr = vec->at(0);
addr = vec.at(0);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(555) == addr.ia.sin_port);
testOk1(htonl(0x7F000001) == addr.ia.sin_addr.s_addr);
testOk1("127.0.0.1:555" == inetAddressToString(addr));
addr = vec->at(1);
addr = vec.at(1);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(1234) == addr.ia.sin_port);
testOk1(htonl(0x0A0A0C0B) == addr.ia.sin_addr.s_addr);
testOk1("10.10.12.11:1234" == inetAddressToString(addr));
addr = vec->at(2);
addr = vec.at(2);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(555) == addr.ia.sin_port);
testOk1(htonl(0xC0A80304) == addr.ia.sin_addr.s_addr);
@ -47,29 +48,30 @@ void test_getSocketAddressList()
auto_ptr<InetAddrVector> vec1(getSocketAddressList("172.16.55.160", 6789, vec.get()));
InetAddrVector vec1;
getSocketAddressList(vec1, "172.16.55.160", 6789, &vec);
testOk1(static_cast<size_t>(4) == vec1->size());
testOk1(static_cast<size_t>(4) == vec1.size());
addr = vec1->at(0);
addr = vec1.at(0);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(6789) == addr.ia.sin_port);
testOk1(htonl(0xAC1037A0) == addr.ia.sin_addr.s_addr);
testOk1("172.16.55.160:6789" == inetAddressToString(addr));
addr = vec1->at(1);
addr = vec1.at(1);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(555) == addr.ia.sin_port);
testOk1(htonl(0x7F000001) == addr.ia.sin_addr.s_addr);
testOk1("127.0.0.1:555" == inetAddressToString(addr));
addr = vec1->at(2);
addr = vec1.at(2);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(1234) == addr.ia.sin_port);
testOk1(htonl(0x0A0A0C0B) == addr.ia.sin_addr.s_addr);
testOk1("10.10.12.11:1234" == inetAddressToString(addr));
addr = vec1->at(3);
addr = vec1.at(3);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(555) == addr.ia.sin_port);
testOk1(htonl(0xC0A80304) == addr.ia.sin_addr.s_addr);
@ -77,31 +79,34 @@ void test_getSocketAddressList()
// empty
auto_ptr<InetAddrVector> vec2(getSocketAddressList("", 1111));
testOk1(static_cast<size_t>(0) == vec2->size());
InetAddrVector vec2;
getSocketAddressList(vec2, "", 1111);
testOk1(static_cast<size_t>(0) == vec2.size());
// just spaces
auto_ptr<InetAddrVector> vec3(getSocketAddressList(" ", 1111));
testOk1(static_cast<size_t>(0) == vec3->size());
InetAddrVector vec3;
getSocketAddressList(vec3, " ", 1111);
testOk1(static_cast<size_t>(0) == vec3.size());
// leading spaces
auto_ptr<InetAddrVector> vec4(getSocketAddressList(" 127.0.0.1 10.10.12.11:1234 192.168.3.4", 555));
InetAddrVector vec4;
getSocketAddressList(vec4, " 127.0.0.1 10.10.12.11:1234 192.168.3.4", 555);
testOk1(static_cast<size_t>(3) == vec4->size());
testOk1(static_cast<size_t>(3) == vec4.size());
addr = vec4->at(0);
addr = vec4.at(0);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(555) == addr.ia.sin_port);
testOk1(htonl(0x7F000001) == addr.ia.sin_addr.s_addr);
testOk1("127.0.0.1:555" == inetAddressToString(addr));
addr = vec4->at(1);
addr = vec4.at(1);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(1234) == addr.ia.sin_port);
testOk1(htonl(0x0A0A0C0B) == addr.ia.sin_addr.s_addr);
testOk1("10.10.12.11:1234" == inetAddressToString(addr));
addr = vec4->at(2);
addr = vec4.at(2);
testOk1(AF_INET == addr.ia.sin_family);
testOk1(htons(555) == addr.ia.sin_port);
testOk1(htonl(0xC0A80304) == addr.ia.sin_addr.s_addr);
@ -112,28 +117,28 @@ void test_ipv4AddressToInt()
{
testDiag("Test ipv4AddressToInt()");
auto_ptr<InetAddrVector> vec(getSocketAddressList("127.0.0.1 10.10.12.11:1234 192.168.3.4", 555));
InetAddrVector vec;
getSocketAddressList(vec, "127.0.0.1 10.10.12.11:1234 192.168.3.4", 555);
testOk1(static_cast<size_t>(3) == vec->size());
testOk1(static_cast<size_t>(3) == vec.size());
testOk1((int32)0x7F000001 == ipv4AddressToInt((vec->at(0))));
testOk1((int32)0x0A0A0C0B == ipv4AddressToInt((vec->at(1))));
testOk1((int32)0xC0A80304 == ipv4AddressToInt((vec->at(2))));
testOk1((int32)0x7F000001 == ipv4AddressToInt((vec.at(0))));
testOk1((int32)0x0A0A0C0B == ipv4AddressToInt((vec.at(1))));
testOk1((int32)0xC0A80304 == ipv4AddressToInt((vec.at(2))));
}
void test_intToIPv4Address()
{
testDiag("Test intToIPv4Address()");
auto_ptr<osiSockAddr> paddr(intToIPv4Address(0x7F000001));
testOk1((uintptr_t)0 != (uintptr_t)paddr.get());
testOk1(AF_INET == paddr->ia.sin_family);
testOk1("127.0.0.1:0" == inetAddressToString(*paddr.get()));
osiSockAddr addr;
intToIPv4Address(addr, 0x7F000001);
testOk1(AF_INET == addr.ia.sin_family);
testOk1("127.0.0.1:0" == inetAddressToString(addr));
paddr.reset(intToIPv4Address(0x0A0A0C0B));
testOk1((uintptr_t)0 != (uintptr_t)paddr.get());
testOk1(AF_INET == paddr->ia.sin_family);
testOk1("10.10.12.11:0" == inetAddressToString(*paddr.get()));
intToIPv4Address(addr, 0x0A0A0C0B);
testOk1(AF_INET == addr.ia.sin_family);
testOk1("10.10.12.11:0" == inetAddressToString(addr));
}
void test_encodeAsIPv6Address()
@ -147,9 +152,8 @@ void test_encodeAsIPv6Address()
(char)0x0A, (char)0x0A, (char)0x0C, (char)0x0B
};
auto_ptr<osiSockAddr> paddr(intToIPv4Address(0x0A0A0C0B));
testOk1((uintptr_t)0 != (uintptr_t)paddr.get());
osiSockAddr addr = *paddr;
osiSockAddr addr;
intToIPv4Address(addr, 0x0A0A0C0B);
encodeAsIPv6Address(buff.get(), &addr);
testOk1(static_cast<size_t>(16) == buff->getPosition());
@ -161,16 +165,17 @@ void test_isMulticastAddress()
{
testDiag("Test test_isMulticastAddress()");
auto_ptr<InetAddrVector> vec(getSocketAddressList("127.0.0.1 255.255.255.255 0.0.0.0 224.0.0.0 239.255.255.255 235.3.6.3", 0));
InetAddrVector vec;
getSocketAddressList(vec, "127.0.0.1 255.255.255.255 0.0.0.0 224.0.0.0 239.255.255.255 235.3.6.3", 0);
testOk1(static_cast<size_t>(6) == vec->size());
testOk1(static_cast<size_t>(6) == vec.size());
testOk1(!isMulticastAddress(&vec->at(0)));
testOk1(!isMulticastAddress(&vec->at(1)));
testOk1(!isMulticastAddress(&vec->at(2)));
testOk1(isMulticastAddress(&vec->at(3)));
testOk1(isMulticastAddress(&vec->at(4)));
testOk1(isMulticastAddress(&vec->at(5)));
testOk1(!isMulticastAddress(&vec.at(0)));
testOk1(!isMulticastAddress(&vec.at(1)));
testOk1(!isMulticastAddress(&vec.at(2)));
testOk1(isMulticastAddress(&vec.at(3)));
testOk1(isMulticastAddress(&vec.at(4)));
testOk1(isMulticastAddress(&vec.at(5)));
}
void test_getBroadcastAddresses()
@ -180,15 +185,16 @@ void test_getBroadcastAddresses()
osiSockAttach();
SOCKET socket = epicsSocketCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP);
auto_ptr<InetAddrVector> broadcasts(getBroadcastAddresses(socket, 6678));
InetAddrVector broadcasts;
getBroadcastAddresses(broadcasts, socket, 6678);
// at least one is expected, in case of no network connection a fallback address is returned
testOk1(static_cast<size_t>(0) < broadcasts->size());
testOk1(static_cast<size_t>(0) < broadcasts.size());
//testDiag("getBroadcastAddresses() returned %zu entry/-ies.", broadcasts->size());
epicsSocketDestroy(socket);
// debug
for(size_t i = 0; i<broadcasts->size(); i++) {
testDiag("%s", inetAddressToString(broadcasts->at(i)).c_str());
for(size_t i = 0; i<broadcasts.size(); i++) {
testDiag("%s", inetAddressToString(broadcasts[i]).c_str());
}
}
@ -229,7 +235,7 @@ void test_multicastLoopback()
SOCKET socket = epicsSocketCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
testOk1(socket != INVALID_SOCKET);
if (socket == INVALID_SOCKET)
return;
testAbort("Can't allocate socket");
unsigned short port = 5555;
@ -246,7 +252,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Failed to bind: %s\n", errStr);
testFail("Failed to bind: %s\n", errStr);
epicsSocketDestroy(socket);
return;
}
@ -270,7 +276,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Error setting IP_ADD_MEMBERSHIP: %s\n", errStr);
testFail("Error setting IP_ADD_MEMBERSHIP: %s\n", errStr);
}
testOk(status == 0, "IP_ADD_MEMBERSHIP set");
@ -288,7 +294,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Error setting IP_MULTICAST_IF: %s\n", errStr);
testFail("Error setting IP_MULTICAST_IF: %s\n", errStr);
}
testOk(status == 0, "IP_MULTICAST_IF set");
@ -300,7 +306,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Error setting IP_MULTICAST_LOOP: %s\n", errStr);
testFail("Error setting IP_MULTICAST_LOOP: %s\n", errStr);
}
testOk(status == 0, "IP_MULTICAST_LOOP set");
@ -317,7 +323,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Multicast send error: %s\n", errStr);
testFail("Multicast send error: %s\n", errStr);
}
testOk((size_t)status == len, "Multicast send");
@ -334,7 +340,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Error setting SO_RCVTIMEO: %s\n", errStr);
testFail("Error setting SO_RCVTIMEO: %s\n", errStr);
}
testOk(status == 0, "SO_RCVTIMEO set");
@ -350,7 +356,7 @@ void test_multicastLoopback()
{
char errStr[64];
epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
fprintf(stderr, "Multicast recv error: %s\n", errStr);
testFail("Multicast recv error: %s\n", errStr);
}
testOk((size_t)status == len, "Multicast recv");
testOk(strncmp(rxbuff, txbuff, len) == 0, "Multicast content matches");
@ -362,7 +368,7 @@ void test_multicastLoopback()
MAIN(testInetAddressUtils)
{
testPlan(83);
testPlan(80);
testDiag("Tests for InetAddress utils");
test_getSocketAddressList();