mirror of
https://github.com/pocoproject/poco.git
synced 2024-12-12 18:20:26 +01:00
enh(UDPHandler): helper functions for data buffer member offsets
This commit is contained in:
parent
25f99ca031
commit
173997964c
@ -225,13 +225,13 @@ public:
|
|||||||
AtomicCounter::ValueType setError(char* pBuf, const std::string& err)
|
AtomicCounter::ValueType setError(char* pBuf, const std::string& err)
|
||||||
/// Sets the error into the buffer.
|
/// Sets the error into the buffer.
|
||||||
{
|
{
|
||||||
std::size_t availLen = S - sizeof(MsgSizeT);
|
std::size_t availLen = S - errorOffset();
|
||||||
std::memset(pBuf + sizeof(MsgSizeT), 0, availLen);
|
std::memset(pBuf + errorOffset(), 0, availLen);
|
||||||
std::size_t msgLen = err.length();
|
std::size_t msgLen = err.length();
|
||||||
if (msgLen)
|
if (msgLen)
|
||||||
{
|
{
|
||||||
if (msgLen >= availLen) msgLen = availLen;
|
if (msgLen >= availLen) msgLen = availLen;
|
||||||
std::memcpy(pBuf + sizeof(MsgSizeT), err.data(), msgLen);
|
std::memcpy(pBuf + errorOffset(), err.data(), msgLen);
|
||||||
}
|
}
|
||||||
setStatus(pBuf, BUF_STATUS_ERROR);
|
setStatus(pBuf, BUF_STATUS_ERROR);
|
||||||
return --_errorBacklog;
|
return --_errorBacklog;
|
||||||
@ -251,10 +251,28 @@ public:
|
|||||||
return *reinterpret_cast<const MsgSizeT*>(pBuf) == BUF_STATUS_ERROR;
|
return *reinterpret_cast<const MsgSizeT*>(pBuf) == BUF_STATUS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Poco::UInt16 offset()
|
static constexpr Poco::UInt16 errorOffset()
|
||||||
|
/// Returns offset of address length.
|
||||||
|
{
|
||||||
|
return sizeof(MsgSizeT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr Poco::UInt16 addressLengthOffset()
|
||||||
|
/// Returns offset of address length.
|
||||||
|
{
|
||||||
|
return sizeof(MsgSizeT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr Poco::UInt16 addressOffset()
|
||||||
|
/// Returns offset of address.
|
||||||
|
{
|
||||||
|
return addressLengthOffset() + sizeof(poco_socklen_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr Poco::UInt16 payloadOffset()
|
||||||
/// Returns buffer data offset.
|
/// Returns buffer data offset.
|
||||||
{
|
{
|
||||||
return sizeof(MsgSizeT) + sizeof(poco_socklen_t) + SocketAddress::MAX_ADDRESS_LENGTH;
|
return addressOffset() + SocketAddress::MAX_ADDRESS_LENGTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MsgSizeT payloadSize(const char* buf)
|
static MsgSizeT payloadSize(const char* buf)
|
||||||
@ -264,8 +282,10 @@ public:
|
|||||||
|
|
||||||
static SocketAddress address(const char* buf)
|
static SocketAddress address(const char* buf)
|
||||||
{
|
{
|
||||||
const auto* len = reinterpret_cast<const poco_socklen_t*>(buf + sizeof(MsgSizeT));
|
const auto* len = reinterpret_cast<const poco_socklen_t*>(buf + addressLengthOffset());
|
||||||
const auto* pSA = reinterpret_cast<const struct sockaddr*>(buf + sizeof(MsgSizeT) + sizeof(poco_socklen_t));
|
const auto* pSA = reinterpret_cast<const struct sockaddr*>(buf + addressOffset());
|
||||||
|
poco_assert(*len <= SocketAddress::MAX_ADDRESS_LENGTH);
|
||||||
|
|
||||||
return SocketAddress(pSA, *len);
|
return SocketAddress(pSA, *len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +300,7 @@ public:
|
|||||||
/// | sizeof(MsgSizeT) bytes | sizeof(poco_socklen_t) | SocketAddress::MAX_ADDRESS_LENGTH | payload |
|
/// | sizeof(MsgSizeT) bytes | sizeof(poco_socklen_t) | SocketAddress::MAX_ADDRESS_LENGTH | payload |
|
||||||
/// +------------------------+------------------------+-----------------------------------+--------- ~ ---+
|
/// +------------------------+------------------------+-----------------------------------+--------- ~ ---+
|
||||||
{
|
{
|
||||||
return buf + offset();
|
return buf + payloadOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Poco::StringTokenizer payload(const char* buf, char delimiter)
|
static Poco::StringTokenizer payload(const char* buf, char delimiter)
|
||||||
|
@ -112,10 +112,10 @@ public:
|
|||||||
p = handler().next(sockfd);
|
p = handler().next(sockfd);
|
||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
Poco::UInt16 off = handler().offset();
|
Poco::UInt16 off = handler().payloadOffset();
|
||||||
poco_socklen_t* pAL = reinterpret_cast<poco_socklen_t*>(p + sizeof(RT));
|
auto* pAL = reinterpret_cast<poco_socklen_t*>(p + handler().addressLengthOffset());
|
||||||
*pAL = SocketAddress::MAX_ADDRESS_LENGTH;
|
*pAL = SocketAddress::MAX_ADDRESS_LENGTH;
|
||||||
struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(p + sizeof(RT) + sizeof(poco_socklen_t));
|
struct sockaddr* pSA = reinterpret_cast<struct sockaddr*>(p + handler().addressOffset());
|
||||||
RT ret = sock.receiveFrom(p + off, S - off - 1, &pSA, &pAL);
|
RT ret = sock.receiveFrom(p + off, S - off - 1, &pSA, &pAL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user