blob: 9dc236fd12d85586ef7f4d5aab3b30d07e3f4fc3 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef RTC_BASE_ASYNC_SOCKET_H_
12#define RTC_BASE_ASYNC_SOCKET_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stddef.h>
15#include <stdint.h>
16
Niels Möller8729d782021-08-11 11:22:44 +020017#include <memory>
18
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "rtc_base/socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "rtc_base/socket_address.h"
Artem Titove41c4332018-07-25 15:04:28 +020021#include "rtc_base/third_party/sigslot/sigslot.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000022
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020023namespace rtc {
24
25// TODO: Remove Socket and rename AsyncSocket to Socket.
26
27// Provides the ability to perform socket I/O asynchronously.
28class AsyncSocket : public Socket {
29 public:
30 AsyncSocket();
31 ~AsyncSocket() override;
32
33 AsyncSocket* Accept(SocketAddress* paddr) override = 0;
34
35 // SignalReadEvent and SignalWriteEvent use multi_threaded_local to allow
36 // access concurrently from different thread.
37 // For example SignalReadEvent::connect will be called in AsyncUDPSocket ctor
38 // but at the same time the SocketDispatcher maybe signaling the read event.
39 // ready to read
Yves Gerey665174f2018-06-19 15:03:05 +020040 sigslot::signal1<AsyncSocket*, sigslot::multi_threaded_local> SignalReadEvent;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020041 // ready to write
Yves Gerey665174f2018-06-19 15:03:05 +020042 sigslot::signal1<AsyncSocket*, sigslot::multi_threaded_local>
43 SignalWriteEvent;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020044 sigslot::signal1<AsyncSocket*> SignalConnectEvent; // connected
45 sigslot::signal2<AsyncSocket*, int> SignalCloseEvent; // closed
46};
47
48class AsyncSocketAdapter : public AsyncSocket, public sigslot::has_slots<> {
49 public:
Niels Möller8729d782021-08-11 11:22:44 +020050 // Takes ownership of the passed in socket.
51 // TODO(bugs.webrtc.org/6424): Change to unique_ptr here and in callers.
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020052 explicit AsyncSocketAdapter(AsyncSocket* socket);
Niels Möller8729d782021-08-11 11:22:44 +020053
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020054 SocketAddress GetLocalAddress() const override;
55 SocketAddress GetRemoteAddress() const override;
56 int Bind(const SocketAddress& addr) override;
57 int Connect(const SocketAddress& addr) override;
58 int Send(const void* pv, size_t cb) override;
59 int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
60 int Recv(void* pv, size_t cb, int64_t* timestamp) override;
61 int RecvFrom(void* pv,
62 size_t cb,
63 SocketAddress* paddr,
64 int64_t* timestamp) override;
65 int Listen(int backlog) override;
66 AsyncSocket* Accept(SocketAddress* paddr) override;
67 int Close() override;
68 int GetError() const override;
69 void SetError(int error) override;
70 ConnState GetState() const override;
71 int GetOption(Option opt, int* value) override;
72 int SetOption(Option opt, int value) override;
73
74 protected:
75 virtual void OnConnectEvent(AsyncSocket* socket);
76 virtual void OnReadEvent(AsyncSocket* socket);
77 virtual void OnWriteEvent(AsyncSocket* socket);
78 virtual void OnCloseEvent(AsyncSocket* socket, int err);
79
Niels Möller8729d782021-08-11 11:22:44 +020080 AsyncSocket* GetSocket() const { return socket_.get(); }
81
82 private:
83 const std::unique_ptr<AsyncSocket> socket_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020084};
85
86} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000087
Steve Anton10542f22019-01-11 09:11:00 -080088#endif // RTC_BASE_ASYNC_SOCKET_H_