1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <vector> 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/asyncfile.h" 17095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#include "webrtc/base/nethelpers.h" 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/socketserver.h" 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/criticalsection.h" 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtypedef int SOCKET; 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WEBRTC_POSIX 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Event constants for the Dispatcher class. 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgenum DispatcherEvent { 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DE_READ = 0x0001, 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DE_WRITE = 0x0002, 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DE_CONNECT = 0x0004, 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DE_CLOSE = 0x0008, 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DE_ACCEPT = 0x0010, 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Signaler; 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass PosixSignalDispatcher; 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Dispatcher { 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Dispatcher() {} 450c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual uint32_t GetRequestedEvents() = 0; 460c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual void OnPreEvent(uint32_t ff) = 0; 470c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström virtual void OnEvent(uint32_t ff, int err) = 0; 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN) 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual WSAEVENT GetWSAEvent() = 0; 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual SOCKET GetSocket() = 0; 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual bool CheckSignalClose() = 0; 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#elif defined(WEBRTC_POSIX) 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual int GetDescriptor() = 0; 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual bool IsDescriptorClosed() = 0; 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// A socket server that provides the real sockets of the underlying OS. 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass PhysicalSocketServer : public SocketServer { 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org PhysicalSocketServer(); 6267186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org ~PhysicalSocketServer() override; 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // SocketFactory: 6567186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org Socket* CreateSocket(int type) override; 6667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org Socket* CreateSocket(int family, int type) override; 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 6867186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org AsyncSocket* CreateAsyncSocket(int type) override; 6967186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org AsyncSocket* CreateAsyncSocket(int family, int type) override; 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Internal Factory for Accept 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncSocket* WrapSocket(SOCKET s); 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // SocketServer: 7567186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org bool Wait(int cms, bool process_io) override; 7667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org void WakeUp() override; 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Add(Dispatcher* dispatcher); 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Remove(Dispatcher* dispatcher); 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org AsyncFile* CreateFile(int fd); 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Sets the function to be executed in response to the specified POSIX signal. 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The function is executed from inside Wait() using the "self-pipe trick"-- 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // regardless of which thread receives the signal--and hence can safely 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // manipulate user-level data structures. 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // "handler" may be SIG_IGN, SIG_DFL, or a user-specified function, just like 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // with signal(2). 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Only one PhysicalSocketServer should have user-level signal handlers. 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Dispatching signals on multiple PhysicalSocketServers is not reliable. 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The signal mask is not modified. It is the caller's responsibily to 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // maintain it as desired. 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual bool SetPosixSignalHandler(int signum, void (*handler)(int)); 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org protected: 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Dispatcher* signal_dispatcher(); 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org typedef std::vector<Dispatcher*> DispatcherList; 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org typedef std::vector<size_t*> IteratorList; 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_POSIX) 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static bool InstallSignal(int signum, void (*handler)(int)); 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_ptr<PosixSignalDispatcher> signal_dispatcher_; 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DispatcherList dispatchers_; 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org IteratorList iterators_; 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Signaler* signal_wakeup_; 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org CriticalSection crit_; 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool fWait_; 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN) 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WSAEVENT socket_ev_; 116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 119095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchclass PhysicalSocket : public AsyncSocket, public sigslot::has_slots<> { 120095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch public: 121095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch PhysicalSocket(PhysicalSocketServer* ss, SOCKET s = INVALID_SOCKET); 122095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch ~PhysicalSocket() override; 123095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 124095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch // Creates the underlying OS socket (same as the "socket" function). 125095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch virtual bool Create(int family, int type); 126095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 127095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch SocketAddress GetLocalAddress() const override; 128095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch SocketAddress GetRemoteAddress() const override; 129095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 130095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Bind(const SocketAddress& bind_addr) override; 131095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Connect(const SocketAddress& addr) override; 132095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 133095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int GetError() const override; 134095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch void SetError(int error) override; 135095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 136095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch ConnState GetState() const override; 137095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 138095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int GetOption(Option opt, int* value) override; 139095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int SetOption(Option opt, int value) override; 140095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 141095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Send(const void* pv, size_t cb) override; 142095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int SendTo(const void* buffer, 143095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch size_t length, 144095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch const SocketAddress& addr) override; 145095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 146095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Recv(void* buffer, size_t length) override; 147095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int RecvFrom(void* buffer, size_t length, SocketAddress* out_addr) override; 148095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 149095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Listen(int backlog) override; 150095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch AsyncSocket* Accept(SocketAddress* out_addr) override; 151095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 152095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Close() override; 153095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 154095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int EstimateMTU(uint16_t* mtu) override; 155095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 156095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch SocketServer* socketserver() { return ss_; } 157095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 158095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch protected: 159095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int DoConnect(const SocketAddress& connect_addr); 160095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 161095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch // Make virtual so ::accept can be overwritten in tests. 162095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch virtual SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen); 163095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 164095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch void OnResolveResult(AsyncResolverInterface* resolver); 165095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 166095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch void UpdateLastError(); 167095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch void MaybeRemapSendError(); 168095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 169095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch static int TranslateOption(Option opt, int* slevel, int* sopt); 170095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 171095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch PhysicalSocketServer* ss_; 172095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch SOCKET s_; 173095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch uint8_t enabled_events_; 174095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch bool udp_; 175095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch mutable CriticalSection crit_; 176095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int error_ GUARDED_BY(crit_); 177095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch ConnState state_; 178095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch AsyncResolver* resolver_; 179095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 180095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#if !defined(NDEBUG) 181095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch std::string dbg_addr_; 182095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#endif 183095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch}; 184095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 185095ae15d6b9ff60357b44ed6f4997754079eff2ejbauchclass SocketDispatcher : public Dispatcher, public PhysicalSocket { 186095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch public: 187095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch explicit SocketDispatcher(PhysicalSocketServer *ss); 188095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch SocketDispatcher(SOCKET s, PhysicalSocketServer *ss); 189095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch ~SocketDispatcher() override; 190095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 191095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch bool Initialize(); 192095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 193095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch virtual bool Create(int type); 194095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch bool Create(int family, int type) override; 195095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 196095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#if defined(WEBRTC_WIN) 197095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch WSAEVENT GetWSAEvent() override; 198095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch SOCKET GetSocket() override; 199095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch bool CheckSignalClose() override; 200095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#elif defined(WEBRTC_POSIX) 201095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int GetDescriptor() override; 202095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch bool IsDescriptorClosed() override; 203095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#endif 204095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 205095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch uint32_t GetRequestedEvents() override; 206095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch void OnPreEvent(uint32_t ff) override; 207095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch void OnEvent(uint32_t ff, int err) override; 208095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 209095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int Close() override; 210095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 211095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#if defined(WEBRTC_WIN) 212095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch private: 213095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch static int next_id_; 214095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int id_; 215095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch bool signal_close_; 216095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch int signal_err_; 217095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch#endif // WEBRTC_WIN 218095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch}; 219095ae15d6b9ff60357b44ed6f4997754079eff2ejbauch 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 223