ESPHome 2025.12.5
Loading...
Searching...
No Matches
socket.h
Go to the documentation of this file.
1#pragma once
2#include <memory>
3#include <string>
4
6#include "headers.h"
7
8#if defined(USE_SOCKET_IMPL_LWIP_TCP) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || defined(USE_SOCKET_IMPL_BSD_SOCKETS)
9namespace esphome {
10namespace socket {
11
12class Socket {
13 public:
14 Socket() = default;
15 virtual ~Socket();
16 Socket(const Socket &) = delete;
17 Socket &operator=(const Socket &) = delete;
18
19 virtual std::unique_ptr<Socket> accept(struct sockaddr *addr, socklen_t *addrlen) = 0;
22 virtual std::unique_ptr<Socket> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) {
23 return accept(addr, addrlen); // Default implementation for backward compatibility
24 }
25 virtual int bind(const struct sockaddr *addr, socklen_t addrlen) = 0;
26 virtual int close() = 0;
27 // not supported yet:
28 // virtual int connect(const std::string &address) = 0;
29#if defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || defined(USE_SOCKET_IMPL_BSD_SOCKETS)
30 virtual int connect(const struct sockaddr *addr, socklen_t addrlen) = 0;
31#endif
32 virtual int shutdown(int how) = 0;
33
34 virtual int getpeername(struct sockaddr *addr, socklen_t *addrlen) = 0;
35 virtual std::string getpeername() = 0;
36 virtual int getsockname(struct sockaddr *addr, socklen_t *addrlen) = 0;
37 virtual std::string getsockname() = 0;
38 virtual int getsockopt(int level, int optname, void *optval, socklen_t *optlen) = 0;
39 virtual int setsockopt(int level, int optname, const void *optval, socklen_t optlen) = 0;
40 virtual int listen(int backlog) = 0;
41 virtual ssize_t read(void *buf, size_t len) = 0;
42 virtual ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len) = 0;
43 virtual ssize_t readv(const struct iovec *iov, int iovcnt) = 0;
44 virtual ssize_t write(const void *buf, size_t len) = 0;
45 virtual ssize_t writev(const struct iovec *iov, int iovcnt) = 0;
46 virtual ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) = 0;
47
48 virtual int setblocking(bool blocking) = 0;
49 virtual int loop() { return 0; };
50
52 virtual int get_fd() const { return -1; }
53
57 bool ready() const;
58
59 protected:
60#ifdef USE_SOCKET_SELECT_SUPPORT
61 bool loop_monitored_{false};
62#endif
63};
64
66std::unique_ptr<Socket> socket(int domain, int type, int protocol);
68std::unique_ptr<Socket> socket_ip(int type, int protocol);
69
76std::unique_ptr<Socket> socket_loop_monitored(int domain, int type, int protocol);
77std::unique_ptr<Socket> socket_ip_loop_monitored(int type, int protocol);
78
80socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port);
81
83socklen_t set_sockaddr_any(struct sockaddr *addr, socklen_t addrlen, uint16_t port);
84
85#if defined(USE_ESP8266) && defined(USE_SOCKET_IMPL_LWIP_TCP)
88void socket_delay(uint32_t ms);
89
91void socket_wake();
92#endif
93
94} // namespace socket
95} // namespace esphome
96#endif
virtual ssize_t write(const void *buf, size_t len)=0
Socket(const Socket &)=delete
virtual int listen(int backlog)=0
virtual int bind(const struct sockaddr *addr, socklen_t addrlen)=0
virtual std::string getpeername()=0
virtual ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len)=0
bool ready() const
Check if socket has data ready to read For loop-monitored sockets, checks with the Application's sele...
Definition socket.cpp:14
virtual int setblocking(bool blocking)=0
virtual ssize_t writev(const struct iovec *iov, int iovcnt)=0
virtual std::unique_ptr< Socket > accept(struct sockaddr *addr, socklen_t *addrlen)=0
virtual ssize_t read(void *buf, size_t len)=0
virtual int setsockopt(int level, int optname, const void *optval, socklen_t optlen)=0
virtual int getsockopt(int level, int optname, void *optval, socklen_t *optlen)=0
virtual ssize_t readv(const struct iovec *iov, int iovcnt)=0
virtual int shutdown(int how)=0
virtual ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)=0
virtual int getpeername(struct sockaddr *addr, socklen_t *addrlen)=0
Socket & operator=(const Socket &)=delete
virtual int loop()
Definition socket.h:49
virtual int getsockname(struct sockaddr *addr, socklen_t *addrlen)=0
virtual std::unique_ptr< Socket > accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen)
Accept a connection and monitor it in the main loop NOTE: This function is NOT thread-safe and must o...
Definition socket.h:22
virtual int close()=0
virtual std::string getsockname()=0
virtual int get_fd() const
Get the underlying file descriptor (returns -1 if not supported)
Definition socket.h:52
bool loop_monitored_
Whether this socket is monitored by the event loop.
Definition socket.h:61
virtual int connect(const struct sockaddr *addr, socklen_t addrlen)=0
uint16_t type
uint16_t flags
uint16_t addr_len
uint32_t socklen_t
Definition headers.h:97
__int64 ssize_t
Definition httplib.h:178
std::unique_ptr< Socket > socket_ip(int type, int protocol)
Create a socket in the newest available IP domain (IPv6 or IPv4) of the given type and protocol.
Definition socket.cpp:36
void socket_wake()
Called by lwip callbacks to signal socket activity and wake delay.
std::unique_ptr< Socket > socket(int domain, int type, int protocol)
Create a socket of the given domain, type and protocol.
std::unique_ptr< Socket > socket_ip_loop_monitored(int type, int protocol)
Definition socket.cpp:44
socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port)
Set a sockaddr to the specified address and port for the IP version used by socket_ip().
Definition socket.cpp:52
socklen_t set_sockaddr_any(struct sockaddr *addr, socklen_t addrlen, uint16_t port)
Set a sockaddr to the any address and specified port for the IP version used by socket_ip().
Definition socket.cpp:91
std::unique_ptr< Socket > socket_loop_monitored(int domain, int type, int protocol)
Create a socket and monitor it for data in the main loop.
void socket_delay(uint32_t ms)
Delay that can be woken early by socket activity.
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:503