#include <sstream>
#include <iostream>
+#include <netinet/in.h>
+
#include "connection.hxx"
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
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));