X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fconnection.cpp;h=d339f9f21b85ea38db0cf05358bbd9486b130d05;hp=a1b22a7086daecd2c95f6276c566dcb12af729fb;hb=b2ba092858a40fc42afba6b529d5b97bcba363e2;hpb=9424729586fdb0aabb671d2f1266bdb07e0bed38 diff --git a/src/connection.cpp b/src/connection.cpp index a1b22a7..d339f9f 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -19,6 +19,9 @@ #include #include +#include + +#include #include "connection.hxx" @@ -27,16 +30,14 @@ namespace libt2n connection::packet_size_indicator connection::bytes_available() { - // max packet size is unsigned int - // no size information -> no packet - if (buffer.size() < sizeof(unsigned int)) + if (buffer.size() < sizeof(packet_size_indicator)) return 0; - packet_size_indicator psize=*((packet_size_indicator*)(buffer.data())); + packet_size_indicator psize=ntohl(*((packet_size_indicator*)(buffer.data()))); // enough data for one packet in buffer? - if (buffer.size() < sizeof(unsigned int)+psize) + if (buffer.size() < sizeof(packet_size_indicator)+psize) return 0; // ok, full packet there @@ -54,19 +55,42 @@ bool connection::get_packet(std::string& data) if ((psize=bytes_available())) { - data.assign(buffer,sizeof(unsigned int),psize); - buffer.erase(0,sizeof(unsigned int)+psize); + data.assign(buffer,sizeof(packet_size_indicator),psize); + buffer.erase(0,sizeof(packet_size_indicator)+psize); return true; } else 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) { // prepend packet size to data - packet_size_indicator psize=data.size(); + packet_size_indicator psize=htonl(data.size()); std::string send_data(data); send_data.insert(0,(char*)&psize,sizeof(packet_size_indicator));