]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/communicator.cpp
Increase Communicator buffer size to 64k
[libs/net.git] / source / net / communicator.cpp
index c9b277d3748de137381b0df792d5230b0e8e0c62..3d6353a2158fb2d62fbe6df164085a1b2ea7a417 100644 (file)
@@ -1,5 +1,8 @@
 #include <cstring>
 #include "communicator.h"
+#include "streamsocket.h"
+
+using namespace std;
 
 namespace {
 
@@ -7,7 +10,7 @@ using namespace Msp::Net;
 
 struct Handshake
 {
-       unsigned hash;
+       Msp::UInt64 hash;
 };
 
 
@@ -27,11 +30,11 @@ HandshakeProtocol::HandshakeProtocol():
 class HandshakeReceiver: public PacketReceiver<Handshake>
 {
 private:
-       unsigned hash;
+       Msp::UInt64 hash;
 
 public:
        HandshakeReceiver();
-       unsigned get_hash() const { return hash; }
+       Msp::UInt64 get_hash() const { return hash; }
        virtual void receive(const Handshake &);
 };
 
@@ -55,7 +58,7 @@ Communicator::Communicator(StreamSocket &s, const Protocol &p, ReceiverBase &r):
        protocol(p),
        receiver(r),
        handshake_status(0),
-       buf_size(1024),
+       buf_size(65536),
        in_buf(new char[buf_size]),
        in_begin(in_buf),
        in_end(in_buf),
@@ -80,44 +83,66 @@ void Communicator::initiate_handshake()
        handshake_status = 1;
 }
 
+void Communicator::send_data(unsigned size)
+{
+       if(!good)
+               throw sequence_error("connection aborted");
+       if(handshake_status!=2)
+               throw sequence_error("handshake incomplete");
+
+       try
+       {
+               socket.write(out_buf, size);
+       }
+       catch(const std::exception &e)
+       {
+               good = false;
+               if(signal_error.empty())
+                       throw;
+               signal_error.emit(e);
+       }
+}
+
 void Communicator::data_available()
 {
        if(!good)
                return;
 
-       in_end += socket.read(in_end, in_buf+buf_size-in_end);
        try
        {
+               in_end += socket.read(in_end, in_buf+buf_size-in_end);
+
                bool more = true;
                while(more)
                {
                        if(handshake_status==2)
-                       {
                                more = receive_packet(protocol, receiver);
-                       }
                        else
                        {
                                HandshakeProtocol hsproto;
                                HandshakeReceiver hsrecv;
                                if((more = receive_packet(hsproto, hsrecv)))
                                {
+                                       if(handshake_status==0)
+                                               send_handshake();
+
                                        if(hsrecv.get_hash()==protocol.get_hash())
                                        {
-                                               if(handshake_status==0)
-                                                       send_handshake();
                                                handshake_status = 2;
                                                signal_handshake_done.emit();
                                        }
                                        else
-                                               good = false;
+                                               throw incompatible_protocol("hash mismatch");
                                }
                        }
                }
        }
-       catch(...)
+       catch(const exception &e)
        {
                good = false;
-               throw;
+               if(signal_error.empty())
+                       throw;
+               signal_error.emit(e);
        }
 }
 
@@ -128,7 +153,7 @@ bool Communicator::receive_packet(const Protocol &proto, ReceiverBase &recv)
        {
                char *pkt = in_begin;
                in_begin += psz;
-               proto.disassemble(recv, pkt, psz);
+               proto.dispatch(recv, pkt, psz);
                return true;
        }
        else
@@ -150,7 +175,7 @@ void Communicator::send_handshake()
        shake.hash = protocol.get_hash();
 
        HandshakeProtocol hsproto;
-       unsigned size = hsproto.assemble(shake, out_buf, buf_size);
+       unsigned size = hsproto.serialize(shake, out_buf, buf_size);
        socket.write(out_buf, size);
 }