ESPHome 2026.3.0-dev
Loading...
Searching...
No Matches
bsd_sockets_impl.h
Go to the documentation of this file.
1#pragma once
3
4#ifdef USE_SOCKET_IMPL_BSD_SOCKETS
5
6#include <memory>
7#include <span>
8
10#include "headers.h"
11
12#ifdef USE_ESP32
13#include <lwip/sockets.h>
14#endif
15
16namespace esphome::socket {
17
19 public:
20 BSDSocketImpl(int fd, bool monitor_loop = false);
22 BSDSocketImpl(const BSDSocketImpl &) = delete;
24
25 int connect(const struct sockaddr *addr, socklen_t addrlen) { return ::connect(this->fd_, addr, addrlen); }
26 std::unique_ptr<BSDSocketImpl> accept(struct sockaddr *addr, socklen_t *addrlen) {
27 int fd = ::accept(this->fd_, addr, addrlen);
28 if (fd == -1)
29 return {};
30 return make_unique<BSDSocketImpl>(fd, false);
31 }
32 std::unique_ptr<BSDSocketImpl> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) {
33 int fd = ::accept(this->fd_, addr, addrlen);
34 if (fd == -1)
35 return {};
36 return make_unique<BSDSocketImpl>(fd, true);
37 }
38
39 int bind(const struct sockaddr *addr, socklen_t addrlen) { return ::bind(this->fd_, addr, addrlen); }
40 int close();
41 int shutdown(int how) { return ::shutdown(this->fd_, how); }
42
43 int getpeername(struct sockaddr *addr, socklen_t *addrlen) { return ::getpeername(this->fd_, addr, addrlen); }
44 int getsockname(struct sockaddr *addr, socklen_t *addrlen) { return ::getsockname(this->fd_, addr, addrlen); }
45
47 size_t getpeername_to(std::span<char, SOCKADDR_STR_LEN> buf);
49 size_t getsockname_to(std::span<char, SOCKADDR_STR_LEN> buf);
50
51 int getsockopt(int level, int optname, void *optval, socklen_t *optlen) {
52 return ::getsockopt(this->fd_, level, optname, optval, optlen);
53 }
54 int setsockopt(int level, int optname, const void *optval, socklen_t optlen) {
55 return ::setsockopt(this->fd_, level, optname, optval, optlen);
56 }
57 int listen(int backlog) { return ::listen(this->fd_, backlog); }
58 ssize_t read(void *buf, size_t len) {
59#ifdef USE_ESP32
60 return ::lwip_read(this->fd_, buf, len);
61#else
62 return ::read(this->fd_, buf, len);
63#endif
64 }
65 ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len) {
66#if defined(USE_ESP32) || defined(USE_HOST)
67 return ::recvfrom(this->fd_, buf, len, 0, addr, addr_len);
68#else
69 return ::lwip_recvfrom(this->fd_, buf, len, 0, addr, addr_len);
70#endif
71 }
72 ssize_t readv(const struct iovec *iov, int iovcnt) {
73#if defined(USE_ESP32)
74 return ::lwip_readv(this->fd_, iov, iovcnt);
75#else
76 return ::readv(this->fd_, iov, iovcnt);
77#endif
78 }
79 ssize_t write(const void *buf, size_t len) {
80#ifdef USE_ESP32
81 return ::lwip_write(this->fd_, buf, len);
82#else
83 return ::write(this->fd_, buf, len);
84#endif
85 }
86 ssize_t send(const void *buf, size_t len, int flags) { return ::send(this->fd_, buf, len, flags); }
87 ssize_t writev(const struct iovec *iov, int iovcnt) {
88#if defined(USE_ESP32)
89 return ::lwip_writev(this->fd_, iov, iovcnt);
90#else
91 return ::writev(this->fd_, iov, iovcnt);
92#endif
93 }
94
95 ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) {
96 return ::sendto(this->fd_, buf, len, flags, to, tolen); // NOLINT(readability-suspicious-call-argument)
97 }
98
99 int setblocking(bool blocking);
100 int loop() { return 0; }
101
102 bool ready() const;
103
104 int get_fd() const { return this->fd_; }
105
106 protected:
107 int fd_{-1};
108 bool closed_{false};
109 bool loop_monitored_{false};
110};
111
112} // namespace esphome::socket
113
114#endif // USE_SOCKET_IMPL_BSD_SOCKETS
BSDSocketImpl & operator=(const BSDSocketImpl &)=delete
std::unique_ptr< BSDSocketImpl > accept(struct sockaddr *addr, socklen_t *addrlen)
int getsockopt(int level, int optname, void *optval, socklen_t *optlen)
ssize_t send(const void *buf, size_t len, int flags)
ssize_t write(const void *buf, size_t len)
BSDSocketImpl(const BSDSocketImpl &)=delete
int getpeername(struct sockaddr *addr, socklen_t *addrlen)
int connect(const struct sockaddr *addr, socklen_t addrlen)
int bind(const struct sockaddr *addr, socklen_t addrlen)
ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len)
ssize_t read(void *buf, size_t len)
ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
size_t getpeername_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format peer address into a fixed-size buffer (no heap allocation)
size_t getsockname_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format local address into a fixed-size buffer (no heap allocation)
int setsockopt(int level, int optname, const void *optval, socklen_t optlen)
ssize_t writev(const struct iovec *iov, int iovcnt)
ssize_t readv(const struct iovec *iov, int iovcnt)
std::unique_ptr< BSDSocketImpl > accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen)
int getsockname(struct sockaddr *addr, socklen_t *addrlen)
BSDSocketImpl(int fd, bool monitor_loop=false)
uint16_t flags
uint16_t addr_len
uint32_t socklen_t
Definition headers.h:97
__int64 ssize_t
Definition httplib.h:178
std::string size_t len
Definition helpers.h:817