inline bool IsBlockingError(int e) { return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
}
// General interface for the socket implementations of various networks. The // methods match those of normal UNIX sockets very closely. class RTC_EXPORT Socket { public: struct ReceiveBuffer {
ReceiveBuffer(Buffer& payload) : payload(payload) {}
// Returns the address to which the socket is bound. If the socket is not // bound, then the any-address is returned. virtual SocketAddress GetLocalAddress() const = 0;
// Returns the address to which the socket is connected. If the socket is // not connected, then the any-address is returned. virtual SocketAddress GetRemoteAddress() const = 0;
virtual int Bind(const SocketAddress& addr) = 0; virtual int Connect(const SocketAddress& addr) = 0; virtual int Send(constvoid* pv, size_t cb) = 0; virtual int SendTo(constvoid* pv, size_t cb, const SocketAddress& addr) = 0; // `timestamp` is in units of microseconds. virtual int Recv(void* pv, size_t cb, int64_t* timestamp) = 0; // TODO(webrtc:15368): Deprecate and remove. virtual int RecvFrom(void* /* pv */,
size_t /* cb */,
SocketAddress* /* paddr */,
int64_t* /* timestamp */) { // Not implemented. Use RecvFrom(ReceiveBuffer& buffer).
RTC_CHECK_NOTREACHED();
} // Intended to replace RecvFrom(void* ...). // Default implementation calls RecvFrom(void* ...) with 64Kbyte buffer. // Returns number of bytes received or a negative value on error. virtual int RecvFrom(ReceiveBuffer& buffer); virtual int Listen(int backlog) = 0; virtual Socket* Accept(SocketAddress* paddr) = 0; virtual int Close() = 0; virtual int GetError() const = 0; virtualvoid SetError(int error) = 0;
inline bool IsBlocking() const { return IsBlockingError(GetError()); }
enum Option {
OPT_DONTFRAGMENT,
OPT_RCVBUF, // receive buffer size
OPT_SNDBUF, // send buffer size
OPT_NODELAY, // whether Nagle algorithm is enabled
OPT_IPV6_V6ONLY, // Whether the socket is IPv6 only.
OPT_DSCP, // DSCP code
OPT_RTP_SENDTIME_EXTN_ID, // This is a non-traditional socket option param. // This is specific to libjingle and will be used // if SendTime option is needed at socket level.
OPT_SEND_ECN, // 2-bit ECN
OPT_RECV_ECN,
OPT_KEEPALIVE, // Enable socket keep alive
OPT_TCP_KEEPCNT, // Set TCP keep alive count
OPT_TCP_KEEPIDLE, // Set TCP keep alive idle time in seconds
OPT_TCP_KEEPINTVL, // Set TCP keep alive interval in seconds
OPT_TCP_USER_TIMEOUT, // Set TCP user timeout
}; virtual int GetOption(Option opt, int* value) = 0; virtual int SetOption(Option opt, int value) = 0;
// SignalReadEvent and SignalWriteEvent use multi_threaded_local to allow // access concurrently from different thread. // For example SignalReadEvent::connect will be called in AsyncUDPSocket ctor // but at the same time the SocketDispatcher may be signaling the read event. // ready to read void SubscribeReadEvent(void* tag,
absl::AnyInvocable<void(Socket*)> callback) {
read_event_callbacks_.AddReceiver(tag, std::move(callback));
} void UnsubscribeReadEvent(void* tag) {
read_event_callbacks_.RemoveReceivers(tag);
} void NotifyReadEvent(Socket* socket) { read_event_callbacks_.Send(socket); } // ready to write void SubscribeWriteEvent(void* tag,
absl::AnyInvocable<void(Socket*)> callback) {
write_event_callbacks_.AddReceiver(tag, std::move(callback));
} void UnsubscribeWriteEvent(void* tag) {
write_event_callbacks_.RemoveReceivers(tag);
} void NotifyWriteEvent(Socket* socket) { write_event_callbacks_.Send(socket); } void SubscribeConnectEvent(void* tag,
absl::AnyInvocable<void(Socket*)> callback) {
connect_event_callbacks_.AddReceiver(tag, std::move(callback));
} void UnsubscribeConnectEvent(void* tag) {
connect_event_callbacks_.RemoveReceivers(tag);
}
[[deprecated]] void SubscribeConnectEvent(
absl::AnyInvocable<void(Socket*)> callback) {
connect_event_callbacks_.AddReceiver(std::move(callback));
} void NotifyConnectEvent(Socket* socket) {
connect_event_callbacks_.Send(socket);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.