X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fconnection.cpp;h=d339f9f21b85ea38db0cf05358bbd9486b130d05;hp=9cffb895a52b755e5b818adaba3ee7e02da36585;hb=b2ba092858a40fc42afba6b529d5b97bcba363e2;hpb=45a2ebc9695c4d7be6548b7e0f800d117ae56a0b diff --git a/src/connection.cpp b/src/connection.cpp index 9cffb89..d339f9f 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -30,8 +30,6 @@ namespace libt2n connection::packet_size_indicator connection::bytes_available() { - // max packet size is unsigned int - // no size information -> no packet if (buffer.size() < sizeof(packet_size_indicator)) return 0; @@ -65,6 +63,29 @@ bool connection::get_packet(std::string& data) return false; } +/** @brief get (maybe incomplete) data of the next packet from the buffer. Does not remove the data + from the connection buffer. + @param[out] data the data package + @retval full size of the packet when it will be complete +*/ +unsigned int connection::peek_packet(std::string& data) +{ + // no size information -> no packet + if (buffer.size() < sizeof(packet_size_indicator)) + return 0; + + packet_size_indicator psize=ntohl(*((packet_size_indicator*)(buffer.data()))); + + // not the full data available? + packet_size_indicator currsize=psize; + if (buffer.size() < currsize+sizeof(packet_size_indicator)) + currsize=buffer.size()-sizeof(packet_size_indicator); + + data.assign(buffer,sizeof(packet_size_indicator),currsize); + + return psize; +} + /// send a blob to the peer void connection::write(const std::string& data) {