diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:45:01 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:01 +0300 |
commit | 2d37894b1b037cf24231090eda8589bbb44fb6fc (patch) | |
tree | be835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/poco/Net/src/ICMPSocketImpl.cpp | |
parent | 718c552901d703c502ccbefdfc3c9028d608b947 (diff) | |
download | ydb-2d37894b1b037cf24231090eda8589bbb44fb6fc.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/poco/Net/src/ICMPSocketImpl.cpp')
-rw-r--r-- | contrib/libs/poco/Net/src/ICMPSocketImpl.cpp | 194 |
1 files changed, 97 insertions, 97 deletions
diff --git a/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp b/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp index b68748e2ab..8c68d53030 100644 --- a/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp +++ b/contrib/libs/poco/Net/src/ICMPSocketImpl.cpp @@ -1,97 +1,97 @@ -// -// ICMPSocketImpl.cpp -// -// Library: Net -// Package: ICMP -// Module: ICMPSocketImpl -// -// Copyright (c) 2006, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Net/ICMPSocketImpl.h" -#include "Poco/Net/NetException.h" -#include "Poco/Timespan.h" -#include "Poco/Timestamp.h" -#include "Poco/Exception.h" -#include "Poco/Buffer.h" - - -using Poco::TimeoutException; -using Poco::Timespan; -using Poco::Exception; - - -namespace Poco { -namespace Net { - - -ICMPSocketImpl::ICMPSocketImpl(IPAddress::Family family, int dataSize, int ttl, int timeout): - RawSocketImpl(family, IPPROTO_ICMP), - _icmpPacket(family, dataSize), - _ttl(ttl), - _timeout(timeout) -{ - setOption(IPPROTO_IP, IP_TTL, ttl); - setReceiveTimeout(Timespan(timeout)); -} - - -ICMPSocketImpl::~ICMPSocketImpl() -{ -} - - -int ICMPSocketImpl::sendTo(const void*, int, const SocketAddress& address, int flags) -{ - int n = SocketImpl::sendTo(_icmpPacket.packet(), _icmpPacket.packetSize(), address, flags); - return n; -} - - -int ICMPSocketImpl::receiveFrom(void*, int, SocketAddress& address, int flags) -{ - int maxPacketSize = _icmpPacket.maxPacketSize(); - Poco::Buffer<unsigned char> buffer(maxPacketSize); - - try - { - Poco::Timestamp ts; - do - { - if (ts.isElapsed(_timeout)) - { - // This guards against a possible DoS attack, where sending - // fake ping responses will cause an endless loop. - throw TimeoutException(); - } - SocketImpl::receiveFrom(buffer.begin(), maxPacketSize, address, flags); - } - while (!_icmpPacket.validReplyID(buffer.begin(), maxPacketSize)); - } - catch (TimeoutException&) - { - throw; - } - catch (Exception&) - { - std::string err = _icmpPacket.errorDescription(buffer.begin(), maxPacketSize); - if (!err.empty()) - throw ICMPException(err); - else - throw; - } - - struct timeval then = _icmpPacket.time(buffer.begin(), maxPacketSize); - struct timeval now = _icmpPacket.time(); - - int elapsed = (((now.tv_sec * 1000000) + now.tv_usec) - ((then.tv_sec * 1000000) + then.tv_usec))/1000; - - return elapsed; -} - - -} } // namespace Poco::Net +// +// ICMPSocketImpl.cpp +// +// Library: Net +// Package: ICMP +// Module: ICMPSocketImpl +// +// Copyright (c) 2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Net/ICMPSocketImpl.h" +#include "Poco/Net/NetException.h" +#include "Poco/Timespan.h" +#include "Poco/Timestamp.h" +#include "Poco/Exception.h" +#include "Poco/Buffer.h" + + +using Poco::TimeoutException; +using Poco::Timespan; +using Poco::Exception; + + +namespace Poco { +namespace Net { + + +ICMPSocketImpl::ICMPSocketImpl(IPAddress::Family family, int dataSize, int ttl, int timeout): + RawSocketImpl(family, IPPROTO_ICMP), + _icmpPacket(family, dataSize), + _ttl(ttl), + _timeout(timeout) +{ + setOption(IPPROTO_IP, IP_TTL, ttl); + setReceiveTimeout(Timespan(timeout)); +} + + +ICMPSocketImpl::~ICMPSocketImpl() +{ +} + + +int ICMPSocketImpl::sendTo(const void*, int, const SocketAddress& address, int flags) +{ + int n = SocketImpl::sendTo(_icmpPacket.packet(), _icmpPacket.packetSize(), address, flags); + return n; +} + + +int ICMPSocketImpl::receiveFrom(void*, int, SocketAddress& address, int flags) +{ + int maxPacketSize = _icmpPacket.maxPacketSize(); + Poco::Buffer<unsigned char> buffer(maxPacketSize); + + try + { + Poco::Timestamp ts; + do + { + if (ts.isElapsed(_timeout)) + { + // This guards against a possible DoS attack, where sending + // fake ping responses will cause an endless loop. + throw TimeoutException(); + } + SocketImpl::receiveFrom(buffer.begin(), maxPacketSize, address, flags); + } + while (!_icmpPacket.validReplyID(buffer.begin(), maxPacketSize)); + } + catch (TimeoutException&) + { + throw; + } + catch (Exception&) + { + std::string err = _icmpPacket.errorDescription(buffer.begin(), maxPacketSize); + if (!err.empty()) + throw ICMPException(err); + else + throw; + } + + struct timeval then = _icmpPacket.time(buffer.begin(), maxPacketSize); + struct timeval now = _icmpPacket.time(); + + int elapsed = (((now.tv_sec * 1000000) + now.tv_usec) - ((then.tv_sec * 1000000) + then.tv_usec))/1000; + + return elapsed; +} + + +} } // namespace Poco::Net |