17class BSDSocketImpl final :
public Socket {
19 BSDSocketImpl(
int fd,
bool monitor_loop =
false) : fd_(fd) {
20#ifdef USE_SOCKET_SELECT_SUPPORT
22 if (monitor_loop && this->fd_ >= 0) {
26 this->loop_monitored_ =
false;
33 ~BSDSocketImpl()
override {
38 int connect(
const struct sockaddr *addr,
socklen_t addrlen)
override { return ::connect(this->fd_, addr, addrlen); }
39 std::unique_ptr<Socket> accept(
struct sockaddr *addr,
socklen_t *addrlen)
override {
40 int fd = ::accept(this->fd_, addr, addrlen);
43 return make_unique<BSDSocketImpl>(fd,
false);
45 std::unique_ptr<Socket> accept_loop_monitored(
struct sockaddr *addr,
socklen_t *addrlen)
override {
46 int fd = ::accept(this->fd_, addr, addrlen);
49 return make_unique<BSDSocketImpl>(fd,
true);
52 int bind(
const struct sockaddr *addr,
socklen_t addrlen)
override { return ::bind(this->fd_, addr, addrlen); }
53 int close()
override {
55#ifdef USE_SOCKET_SELECT_SUPPORT
57 if (this->loop_monitored_) {
61 int ret = ::close(this->fd_);
67 int shutdown(
int how)
override { return ::shutdown(this->fd_, how); }
70 return ::getpeername(this->fd_, addr, addrlen);
73 return ::getsockname(this->fd_, addr, addrlen);
75 int getsockopt(
int level,
int optname,
void *optval,
socklen_t *optlen)
override {
76 return ::getsockopt(this->fd_, level, optname, optval, optlen);
78 int setsockopt(
int level,
int optname,
const void *optval,
socklen_t optlen)
override {
79 return ::setsockopt(this->fd_, level, optname, optval, optlen);
81 int listen(
int backlog)
override { return ::listen(this->fd_, backlog); }
84 return ::lwip_read(this->fd_, buf,
len);
86 return ::read(this->fd_, buf,
len);
90#if defined(USE_ESP32) || defined(USE_HOST)
91 return ::recvfrom(this->fd_, buf,
len, 0, addr,
addr_len);
93 return ::lwip_recvfrom(this->fd_, buf,
len, 0, addr,
addr_len);
96 ssize_t readv(
const struct iovec *iov,
int iovcnt)
override {
98 return ::lwip_readv(this->fd_, iov, iovcnt);
100 return ::readv(this->fd_, iov, iovcnt);
103 ssize_t write(
const void *buf,
size_t len)
override {
105 return ::lwip_write(this->fd_, buf,
len);
107 return ::write(this->fd_, buf,
len);
111 ssize_t writev(
const struct iovec *iov,
int iovcnt)
override {
112#if defined(USE_ESP32)
113 return ::lwip_writev(this->fd_, iov, iovcnt);
115 return ::writev(this->fd_, iov, iovcnt);
120 return ::sendto(this->fd_, buf,
len,
flags, to, tolen);
123 int setblocking(
bool blocking)
override {
124 int fl = ::fcntl(this->fd_, F_GETFL, 0);
130 ::fcntl(this->fd_, F_SETFL, fl);
134 int get_fd()
const override {
return this->fd_; }
136#ifdef USE_SOCKET_SELECT_SUPPORT
137 bool ready()
const override {
138 if (!this->loop_monitored_)
147#ifdef USE_SOCKET_SELECT_SUPPORT
148 bool loop_monitored_{
false};
153static std::unique_ptr<Socket> create_socket(
int domain,
int type,
int protocol,
bool loop_monitored =
false) {
154 int ret = ::socket(domain,
type, protocol);
157 return std::unique_ptr<Socket>{
new BSDSocketImpl(ret, loop_monitored)};
160std::unique_ptr<Socket>
socket(
int domain,
int type,
int protocol) {
161 return create_socket(domain,
type, protocol,
false);
165 return create_socket(domain,
type, protocol,
true);