ESPHome 2026.2.1
Loading...
Searching...
No Matches
socket.h
Go to the documentation of this file.
1#pragma once
2#include <memory>
3#include <span>
4#include <string>
5
7#include "headers.h"
8
9#if defined(USE_SOCKET_IMPL_LWIP_TCP) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || defined(USE_SOCKET_IMPL_BSD_SOCKETS)
10namespace esphome::socket {
11
12// Maximum length for formatted socket address string (IP address without port)
13// IPv4: "255.255.255.255" = 15 chars + null = 16
14// IPv6: full address = 45 chars + null = 46
15#if USE_NETWORK_IPV6
16static constexpr size_t SOCKADDR_STR_LEN = 46; // INET6_ADDRSTRLEN
17#else
18static constexpr size_t SOCKADDR_STR_LEN = 16; // INET_ADDRSTRLEN
19#endif
20
21class Socket {
22 public:
23 Socket() = default;
24 virtual ~Socket();
25 Socket(const Socket &) = delete;
26 Socket &operator=(const Socket &) = delete;
27
28 virtual std::unique_ptr<Socket> accept(struct sockaddr *addr, socklen_t *addrlen) = 0;
31 virtual std::unique_ptr<Socket> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) {
32 return accept(addr, addrlen); // Default implementation for backward compatibility
33 }
34 virtual int bind(const struct sockaddr *addr, socklen_t addrlen) = 0;
35 virtual int close() = 0;
36 // not supported yet:
37 // virtual int connect(const std::string &address) = 0;
38#if defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || defined(USE_SOCKET_IMPL_BSD_SOCKETS)
39 virtual int connect(const struct sockaddr *addr, socklen_t addrlen) = 0;
40#endif
41 virtual int shutdown(int how) = 0;
42
43 virtual int getpeername(struct sockaddr *addr, socklen_t *addrlen) = 0;
44 virtual int getsockname(struct sockaddr *addr, socklen_t *addrlen) = 0;
45
49 size_t getpeername_to(std::span<char, SOCKADDR_STR_LEN> buf);
52 size_t getsockname_to(std::span<char, SOCKADDR_STR_LEN> buf);
53 virtual int getsockopt(int level, int optname, void *optval, socklen_t *optlen) = 0;
54 virtual int setsockopt(int level, int optname, const void *optval, socklen_t optlen) = 0;
55 virtual int listen(int backlog) = 0;
56 virtual ssize_t read(void *buf, size_t len) = 0;
57 virtual ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len) = 0;
58 virtual ssize_t readv(const struct iovec *iov, int iovcnt) = 0;
59 virtual ssize_t write(const void *buf, size_t len) = 0;
60 virtual ssize_t writev(const struct iovec *iov, int iovcnt) = 0;
61 virtual ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) = 0;
62
63 virtual int setblocking(bool blocking) = 0;
64 virtual int loop() { return 0; };
65
68#ifdef USE_SOCKET_SELECT_SUPPORT
69 int get_fd() const { return this->fd_; }
70#else
71 int get_fd() const { return -1; }
72#endif
73
77#ifdef USE_SOCKET_SELECT_SUPPORT
78 bool ready() const;
79#else
80 virtual bool ready() const { return true; }
81#endif
82
83 protected:
84#ifdef USE_SOCKET_SELECT_SUPPORT
85 int fd_{-1};
86 bool closed_{false};
87 bool loop_monitored_{false};
88#endif
89};
90
92std::unique_ptr<Socket> socket(int domain, int type, int protocol);
94std::unique_ptr<Socket> socket_ip(int type, int protocol);
95
102std::unique_ptr<Socket> socket_loop_monitored(int domain, int type, int protocol);
103std::unique_ptr<Socket> socket_ip_loop_monitored(int type, int protocol);
104
111socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const char *ip_address, uint16_t port);
112
114inline socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port) {
115 return set_sockaddr(addr, addrlen, ip_address.c_str(), port);
116}
117
119socklen_t set_sockaddr_any(struct sockaddr *addr, socklen_t addrlen, uint16_t port);
120
122size_t format_sockaddr_to(const struct sockaddr *addr_ptr, socklen_t len, std::span<char, SOCKADDR_STR_LEN> buf);
123
124#if defined(USE_ESP8266) && defined(USE_SOCKET_IMPL_LWIP_TCP)
127void socket_delay(uint32_t ms);
128
130void socket_wake();
131#endif
132
133} // namespace esphome::socket
134#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 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 select()-based sockets: non-virtual, checks Application's ...
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:64
int get_fd() const
Get the underlying file descriptor (returns -1 if not supported) Non-virtual: only one socket impleme...
Definition socket.h:69
size_t getsockname_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format local address into a fixed-size buffer (no heap allocation) Non-virtual wrapper around getsock...
Definition socket.cpp:94
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:31
virtual int close()=0
size_t getpeername_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format peer address into a fixed-size buffer (no heap allocation) Non-virtual wrapper around getpeern...
Definition socket.cpp:84
virtual int connect(const struct sockaddr *addr, socklen_t addrlen)=0
virtual bool ready() const
Definition socket.h:80
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
socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const char *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:120
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:104
size_t format_sockaddr_to(const struct sockaddr *addr_ptr, socklen_t len, std::span< char, SOCKADDR_STR_LEN > buf)
Format sockaddr into caller-provided buffer, returns length written (excluding null)
Definition socket.cpp:53
void socket_wake()
Called by lwip callbacks to signal socket activity and wake delay.
std::unique_ptr< Socket > socket_ip_loop_monitored(int type, int protocol)
Definition socket.cpp:112
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:159
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.
std::string size_t len
Definition helpers.h:692