00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #pragma once
00019
00020 #include "sock.h"
00021 #include "message.h"
00022
00023 namespace mongo {
00024
00025 class MessagingPort;
00026 class PiggyBackData;
00027
00028 typedef AtomicUInt MSGID;
00029
00030 class AbstractMessagingPort : boost::noncopyable {
00031 public:
00032 AbstractMessagingPort() : tag(0) {}
00033 virtual ~AbstractMessagingPort() { }
00034 virtual void reply(Message& received, Message& response, MSGID responseTo) = 0;
00035 virtual void reply(Message& received, Message& response) = 0;
00036
00037 virtual HostAndPort remote() const = 0;
00038 virtual unsigned remotePort() const = 0;
00039
00040 private:
00041
00042 public:
00043
00044
00045
00046 unsigned tag;
00047
00048 };
00049
00050 class MessagingPort : public AbstractMessagingPort , public Socket {
00051 public:
00052 MessagingPort(int fd, const SockAddr& remote);
00053
00054
00055
00056
00057 MessagingPort(double so_timeout = 0, int logLevel = 0 );
00058
00059 MessagingPort(Socket& socket);
00060
00061 virtual ~MessagingPort();
00062
00063 void shutdown();
00064
00065
00066
00067
00068 bool recv(Message& m);
00069 void reply(Message& received, Message& response, MSGID responseTo);
00070 void reply(Message& received, Message& response);
00071 bool call(Message& toSend, Message& response);
00072
00073 void say(Message& toSend, int responseTo = -1);
00074
00084 bool recv( const Message& sent , Message& response );
00085
00086 void piggyBack( Message& toSend , int responseTo = -1 );
00087
00088 unsigned remotePort() const { return Socket::remotePort(); }
00089 virtual HostAndPort remote() const;
00090
00091
00092 private:
00093
00094 PiggyBackData * piggyBackData;
00095
00096
00097
00098 mutable HostAndPort _remoteParsed;
00099
00100 public:
00101 static void closeAllSockets(unsigned tagMask = 0xffffffff);
00102
00103 friend class PiggyBackData;
00104 };
00105
00106
00107 }