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