X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fnet%2Fcommunicator.cpp;h=22a79631d9a214741fdbf71721d8e6322986ea4e;hb=8248f2912454229f4ded72b8fb4db3e76ea3ad15;hp=b30a8e965c388c8457b26ae454ce6c399fe5f6fc;hpb=3c2a877580e234df5fcbe06bf2850cd29f875e28;p=libs%2Fnet.git diff --git a/source/net/communicator.cpp b/source/net/communicator.cpp index b30a8e9..22a7963 100644 --- a/source/net/communicator.cpp +++ b/source/net/communicator.cpp @@ -1,5 +1,7 @@ #include #include "communicator.h" +#include "protocol_impl.h" +#include "streamsocket.h" using namespace std; @@ -9,7 +11,7 @@ using namespace Msp::Net; struct Handshake { - unsigned hash; + Msp::UInt64 hash; }; @@ -29,11 +31,11 @@ HandshakeProtocol::HandshakeProtocol(): class HandshakeReceiver: public PacketReceiver { 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 &); }; @@ -57,7 +59,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), @@ -82,6 +84,26 @@ 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) @@ -95,24 +117,23 @@ void Communicator::data_available() 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"); } } }