17class BSDSocketImpl final :
public Socket {
19 BSDSocketImpl(
int fd,
bool monitor_loop =
false) {
22 if (monitor_loop && this->
fd_ >= 0) {
27 ~BSDSocketImpl()
override {
32 int connect(
const struct sockaddr *addr,
socklen_t addrlen)
override { return ::connect(this->
fd_, addr, addrlen); }
33 std::unique_ptr<Socket> accept(
struct sockaddr *addr,
socklen_t *addrlen)
override {
34 int fd = ::accept(this->
fd_, addr, addrlen);
37 return make_unique<BSDSocketImpl>(fd,
false);
39 std::unique_ptr<Socket> accept_loop_monitored(
struct sockaddr *addr,
socklen_t *addrlen)
override {
40 int fd = ::accept(this->
fd_, addr, addrlen);
43 return make_unique<BSDSocketImpl>(fd,
true);
46 int bind(
const struct sockaddr *addr,
socklen_t addrlen)
override { return ::bind(this->
fd_, addr, addrlen); }
47 int close()
override {
53 int ret = ::close(this->
fd_);
59 int shutdown(
int how)
override { return ::shutdown(this->
fd_, how); }
62 return ::getpeername(this->
fd_, addr, addrlen);
65 return ::getsockname(this->
fd_, addr, addrlen);
67 int getsockopt(
int level,
int optname,
void *optval,
socklen_t *optlen)
override {
68 return ::getsockopt(this->
fd_, level, optname, optval, optlen);
70 int setsockopt(
int level,
int optname,
const void *optval,
socklen_t optlen)
override {
71 return ::setsockopt(this->
fd_, level, optname, optval, optlen);
73 int listen(
int backlog)
override { return ::listen(this->
fd_, backlog); }
76 return ::lwip_read(this->
fd_, buf,
len);
78 return ::read(this->
fd_, buf,
len);
82#if defined(USE_ESP32) || defined(USE_HOST)
88 ssize_t readv(
const struct iovec *iov,
int iovcnt)
override {
90 return ::lwip_readv(this->
fd_, iov, iovcnt);
92 return ::readv(this->
fd_, iov, iovcnt);
95 ssize_t write(
const void *buf,
size_t len)
override {
97 return ::lwip_write(this->
fd_, buf,
len);
99 return ::write(this->
fd_, buf,
len);
103 ssize_t writev(
const struct iovec *iov,
int iovcnt)
override {
104#if defined(USE_ESP32)
105 return ::lwip_writev(this->
fd_, iov, iovcnt);
107 return ::writev(this->
fd_, iov, iovcnt);
112 return ::sendto(this->
fd_, buf,
len,
flags, to, tolen);
115 int setblocking(
bool blocking)
override {
116 int fl = ::fcntl(this->
fd_, F_GETFL, 0);
122 ::fcntl(this->
fd_, F_SETFL, fl);
128static std::unique_ptr<Socket> create_socket(
int domain,
int type,
int protocol,
bool loop_monitored =
false) {
129 int ret = ::socket(domain,
type, protocol);
132 return std::unique_ptr<Socket>{
new BSDSocketImpl(ret, loop_monitored)};
135std::unique_ptr<Socket>
socket(
int domain,
int type,
int protocol) {
136 return create_socket(domain,
type, protocol,
false);
140 return create_socket(domain,
type, protocol,
true);