int ICMPSocketImpl::receiveFrom(void*, int, SocketAddress& address, int flags) { int maxPacketSize = _icmpPacket.maxPacketSize(); unsigned char* buffer = new unsigned char[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, maxPacketSize, address, flags); } while (!_icmpPacket.validReplyID(buffer, maxPacketSize)); } catch (TimeoutException&) { delete [] buffer; throw; } catch (Exception&) { std::string err = _icmpPacket.errorDescription(buffer, maxPacketSize); delete [] buffer; if (!err.empty()) throw ICMPException(err); else throw; } struct timeval then = _icmpPacket.time(buffer, maxPacketSize); struct timeval now = _icmpPacket.time(); int elapsed = (((now.tv_sec * 1000000) + now.tv_usec) - ((then.tv_sec * 1000000) + then.tv_usec))/1000; delete[] buffer; return elapsed; }
int ICMPSocketImpl::receiveFrom(void*, int, SocketAddress& address, int flags) { int maxPacketSize = _icmpPacket.maxPacketSize(); unsigned char* buffer = new unsigned char[maxPacketSize]; try { do { SocketImpl::receiveFrom(buffer, maxPacketSize, address, flags); } while(!_icmpPacket.validReplyID(buffer, maxPacketSize)); } catch (TimeoutException&) { delete[] buffer; throw; } catch (Exception&) { std::string err = _icmpPacket.errorDescription(buffer, maxPacketSize); delete[] buffer; if (!err.empty()) throw ICMPException(err); else throw; } struct timeval then = _icmpPacket.time(buffer, maxPacketSize); struct timeval now = _icmpPacket.time(); int elapsed = (((now.tv_sec * 1000000) + now.tv_usec) - ((then.tv_sec * 1000000) + then.tv_usec))/1000; delete[] buffer; return elapsed; }