Handle response.
252 transport, version, command, payloadSize, payloadBuffer);
254 transport->ensureData(4+1+3+16+2);
256 size_t startPosition = payloadBuffer->
getPosition();
258 const int32 searchSequenceId = payloadBuffer->
getInt();
266 memset(&responseAddress, 0,
sizeof(responseAddress));
267 responseAddress.
ia.sin_family = AF_INET;
273 if (responseAddress.
ia.sin_addr.s_addr == INADDR_ANY)
274 responseAddress.
ia.sin_addr = responseFrom->
ia.sin_addr;
278 responseAddress.
ia.sin_port = htons(port);
281 bool allowed = (protocolsCount == 0);
282 for (
size_t i = 0;
i < protocolsCount;
i++)
291 transport->ensureData(2);
301 if ((qosCode & 0x80) == 0x80)
304 if (bt && bt->hasLocalMulticastAddress())
313 payloadBuffer->
putInt(16);
318 payloadBuffer->
put(startPosition+4, (
int8)(qosCode & ~0x80));
328 bt->getLocalMulticastAddress());
334 PeerInfo::shared_pointer info;
337 info->transport =
"pva";
339 info->transportVersion = version;
347 transport->ensureData(4);
354 const std::vector<ChannelProvider::shared_pointer>& _providers =
_context->getChannelProviders();
356 int providerCount = _providers.size();
358 tp->set(name, searchSequenceId, cid, responseAddress, responseRequired,
false);
360 for (
int i = 0;
i < providerCount;
i++)
361 _providers[
i]->channelFind(name, tp);
372 double delay = double(rand())/RAND_MAX;
373 delay = delay*0.1 + 0.05;
376 tp->set(
"", searchSequenceId, 0, responseAddress,
true,
true);
378 TimerCallback::shared_pointer tc = tp;
379 _context->getTimer()->scheduleAfterDelay(tc, delay);
Information provded by a client to a server-type ChannelProvider.
EPICS_ALWAYS_INLINE int8 getByte()
static std::string deserializeString(ByteBuffer *buffer, DeserializableControl *control)
EPICS_ALWAYS_INLINE void putInt(int32 value)
const char * getBuffer() const
virtual void handleResponse(osiSockAddr *responseFrom, Transport::shared_pointer const &transport, epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize, epics::pvData::ByteBuffer *payloadBuffer)
std::size_t getLimit() const
static std::size_t readSize(ByteBuffer *buffer, DeserializableControl *control)
std::size_t getPosition() const
EPICS_ALWAYS_INLINE int32 getInt()
void setPosition(std::size_t pos)
void encodeAsIPv6Address(ByteBuffer *buffer, const osiSockAddr *address)
const epics::pvData::int16 PVA_MESSAGE_HEADER_SIZE
EPICS_ALWAYS_INLINE void putByte(int8 value)
EPICS_ALWAYS_INLINE int16 getShort()
bool decodeAsIPv6Address(ByteBuffer *buffer, osiSockAddr *address)
static const std::string SUPPORTED_PROTOCOL
ServerContextImpl::shared_pointer _context
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
string inetAddressToString(const osiSockAddr &addr, bool displayPort, bool displayHex)