diff options
Diffstat (limited to 'webrtc/base/physicalsocketserver.h')
-rw-r--r-- | webrtc/base/physicalsocketserver.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/webrtc/base/physicalsocketserver.h b/webrtc/base/physicalsocketserver.h index af09e0b988..ae1f10f596 100644 --- a/webrtc/base/physicalsocketserver.h +++ b/webrtc/base/physicalsocketserver.h @@ -14,6 +14,7 @@ #include <vector> #include "webrtc/base/asyncfile.h" +#include "webrtc/base/nethelpers.h" #include "webrtc/base/scoped_ptr.h" #include "webrtc/base/socketserver.h" #include "webrtc/base/criticalsection.h" @@ -115,6 +116,107 @@ class PhysicalSocketServer : public SocketServer { #endif }; +class PhysicalSocket : public AsyncSocket, public sigslot::has_slots<> { + public: + PhysicalSocket(PhysicalSocketServer* ss, SOCKET s = INVALID_SOCKET); + ~PhysicalSocket() override; + + // Creates the underlying OS socket (same as the "socket" function). + virtual bool Create(int family, int type); + + SocketAddress GetLocalAddress() const override; + SocketAddress GetRemoteAddress() const override; + + int Bind(const SocketAddress& bind_addr) override; + int Connect(const SocketAddress& addr) override; + + int GetError() const override; + void SetError(int error) override; + + ConnState GetState() const override; + + int GetOption(Option opt, int* value) override; + int SetOption(Option opt, int value) override; + + int Send(const void* pv, size_t cb) override; + int SendTo(const void* buffer, + size_t length, + const SocketAddress& addr) override; + + int Recv(void* buffer, size_t length) override; + int RecvFrom(void* buffer, size_t length, SocketAddress* out_addr) override; + + int Listen(int backlog) override; + AsyncSocket* Accept(SocketAddress* out_addr) override; + + int Close() override; + + int EstimateMTU(uint16_t* mtu) override; + + SocketServer* socketserver() { return ss_; } + + protected: + int DoConnect(const SocketAddress& connect_addr); + + // Make virtual so ::accept can be overwritten in tests. + virtual SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen); + + void OnResolveResult(AsyncResolverInterface* resolver); + + void UpdateLastError(); + void MaybeRemapSendError(); + + static int TranslateOption(Option opt, int* slevel, int* sopt); + + PhysicalSocketServer* ss_; + SOCKET s_; + uint8_t enabled_events_; + bool udp_; + mutable CriticalSection crit_; + int error_ GUARDED_BY(crit_); + ConnState state_; + AsyncResolver* resolver_; + +#if !defined(NDEBUG) + std::string dbg_addr_; +#endif +}; + +class SocketDispatcher : public Dispatcher, public PhysicalSocket { + public: + explicit SocketDispatcher(PhysicalSocketServer *ss); + SocketDispatcher(SOCKET s, PhysicalSocketServer *ss); + ~SocketDispatcher() override; + + bool Initialize(); + + virtual bool Create(int type); + bool Create(int family, int type) override; + +#if defined(WEBRTC_WIN) + WSAEVENT GetWSAEvent() override; + SOCKET GetSocket() override; + bool CheckSignalClose() override; +#elif defined(WEBRTC_POSIX) + int GetDescriptor() override; + bool IsDescriptorClosed() override; +#endif + + uint32_t GetRequestedEvents() override; + void OnPreEvent(uint32_t ff) override; + void OnEvent(uint32_t ff, int err) override; + + int Close() override; + +#if defined(WEBRTC_WIN) + private: + static int next_id_; + int id_; + bool signal_close_; + int signal_err_; +#endif // WEBRTC_WIN +}; + } // namespace rtc #endif // WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ |