Update yasio

This commit is contained in:
halx99 2021-10-26 13:26:36 +08:00
parent d8ed219bc4
commit d628a07919
5 changed files with 20 additions and 13 deletions

View File

@ -98,6 +98,7 @@ SOFTWARE.
#endif #endif
// Test whether sockaddr has member 'sa_len' // Test whether sockaddr has member 'sa_len'
// see also: https://github.com/freebsd/freebsd-src/blob/main/sys/sys/socket.h#L329
#if defined(__linux__) || defined(_WIN32) #if defined(__linux__) || defined(_WIN32)
# define YASIO__HAS_SA_LEN 0 # define YASIO__HAS_SA_LEN 0
#else #else

View File

@ -521,7 +521,7 @@ int xxsocket::test_nonblocking(socket_native_type s)
} }
int xxsocket::bind(const char* addr, unsigned short port) const { return this->bind(endpoint(addr, port)); } int xxsocket::bind(const char* addr, unsigned short port) const { return this->bind(endpoint(addr, port)); }
int xxsocket::bind(const endpoint& ep) const { return ::bind(this->fd, &ep.sa_, ep.len()); } int xxsocket::bind(const endpoint& ep) const { return ::bind(this->fd, &ep, ep.len()); }
int xxsocket::bind_any(bool ipv6) const { return this->bind(endpoint(!ipv6 ? "0.0.0.0" : "::", 0)); } int xxsocket::bind_any(bool ipv6) const { return this->bind(endpoint(!ipv6 ? "0.0.0.0" : "::", 0)); }
int xxsocket::listen(int backlog) const { return ::listen(this->fd, backlog); } int xxsocket::listen(int backlog) const { return ::listen(this->fd, backlog); }
@ -562,7 +562,7 @@ int xxsocket::connect(socket_native_type s, const char* addr, u_short port)
return xxsocket::connect(s, peer); return xxsocket::connect(s, peer);
} }
int xxsocket::connect(socket_native_type s, const endpoint& ep) { return ::connect(s, &ep.sa_, ep.len()); } int xxsocket::connect(socket_native_type s, const endpoint& ep) { return ::connect(s, &ep, ep.len()); }
int xxsocket::connect_n(const char* addr, u_short port, const std::chrono::microseconds& wtimeout) { return connect_n(ip::endpoint(addr, port), wtimeout); } int xxsocket::connect_n(const char* addr, u_short port, const std::chrono::microseconds& wtimeout) { return connect_n(ip::endpoint(addr, port), wtimeout); }
int xxsocket::connect_n(const endpoint& ep, const std::chrono::microseconds& wtimeout) { return this->connect_n(this->fd, ep, wtimeout); } int xxsocket::connect_n(const endpoint& ep, const std::chrono::microseconds& wtimeout) { return this->connect_n(this->fd, ep, wtimeout); }
@ -730,13 +730,13 @@ int xxsocket::recv(socket_native_type s, void* buf, int len, int flags) { return
int xxsocket::sendto(const void* buf, int len, const endpoint& to, int flags) const int xxsocket::sendto(const void* buf, int len, const endpoint& to, int flags) const
{ {
return static_cast<int>(::sendto(this->fd, (const char*)buf, len, flags, &to.sa_, to.len())); return static_cast<int>(::sendto(this->fd, (const char*)buf, len, flags, &to, to.len()));
} }
int xxsocket::recvfrom(void* buf, int len, endpoint& from, int flags) const int xxsocket::recvfrom(void* buf, int len, endpoint& from, int flags) const
{ {
socklen_t addrlen{sizeof(from)}; socklen_t addrlen{sizeof(from)};
int n = static_cast<int>(::recvfrom(this->fd, (char*)buf, len, flags, &from.sa_, &addrlen)); int n = static_cast<int>(::recvfrom(this->fd, (char*)buf, len, flags, &from, &addrlen));
from.len(addrlen); from.len(addrlen);
return n; return n;
} }
@ -800,7 +800,7 @@ endpoint xxsocket::local_endpoint(socket_native_type fd)
{ {
endpoint ep; endpoint ep;
socklen_t socklen = sizeof(ep); socklen_t socklen = sizeof(ep);
getsockname(fd, &ep.sa_, &socklen); getsockname(fd, &ep, &socklen);
ep.len(socklen); ep.len(socklen);
return ep; return ep;
} }
@ -810,7 +810,7 @@ endpoint xxsocket::peer_endpoint(socket_native_type fd)
{ {
endpoint ep; endpoint ep;
socklen_t socklen = sizeof(ep); socklen_t socklen = sizeof(ep);
getpeername(fd, &ep.sa_, &socklen); getpeername(fd, &ep, &socklen);
ep.len(socklen); ep.len(socklen);
return ep; return ep;
} }

View File

@ -38,6 +38,7 @@ SOFTWARE.
#include <vector> #include <vector>
#include <chrono> #include <chrono>
#include <functional> #include <functional>
#include <memory>
#include "yasio/detail/socket.hpp" #include "yasio/detail/socket.hpp"
#include "yasio/detail/logging.hpp" #include "yasio/detail/logging.hpp"
@ -301,10 +302,8 @@ public:
{ {
this->zeroset(); this->zeroset();
this->af(AF_INET);
this->addr_v4(addr); this->addr_v4(addr);
this->port(port); this->port(port);
this->len(sizeof(sockaddr_in));
return *this; return *this;
} }
@ -368,8 +367,13 @@ public:
unsigned short port() const { return ntohs(in4_.sin_port); } unsigned short port() const { return ntohs(in4_.sin_port); }
void port(unsigned short value) { in4_.sin_port = htons(value); } void port(unsigned short value) { in4_.sin_port = htons(value); }
void addr_v4(uint32_t addr) { in4_.sin_addr.s_addr = htonl(addr); } void addr_v4(uint32_t addr)
uint32_t addr_v4() const { return ntohl(in4_.sin_addr.s_addr); } {
this->af(AF_INET);
in4_.sin_addr.s_addr = htonl(addr);
this->len(sizeof(sockaddr_in));
}
uint32_t addr_v4() const { return af() == AF_INET ? ntohl(in4_.sin_addr.s_addr) : 0u; }
// check does endpoint is global address, not linklocal or loopback // check does endpoint is global address, not linklocal or loopback
bool is_global() const bool is_global() const
@ -499,6 +503,9 @@ public:
return s; return s;
} }
sockaddr* operator&() { return &sa_; }
const sockaddr* operator&() const { return &sa_; }
union { union {
sockaddr sa_; sockaddr sa_;
sockaddr_in in4_; sockaddr_in in4_;

View File

@ -211,7 +211,7 @@ void highp_timer::cancel(io_service& service)
int io_send_op::perform(io_transport* transport, const void* buf, int n) { return transport->write_cb_(buf, n, nullptr); } int io_send_op::perform(io_transport* transport, const void* buf, int n) { return transport->write_cb_(buf, n, nullptr); }
/// io_sendto_op /// io_sendto_op
int io_sendto_op::perform(io_transport* transport, const void* buf, int n) { return transport->write_cb_(buf, n, &destination_); } int io_sendto_op::perform(io_transport* transport, const void* buf, int n) { return transport->write_cb_(buf, n, std::addressof(destination_)); }
#if defined(YASIO_SSL_BACKEND) #if defined(YASIO_SSL_BACKEND)
void ssl_auto_handle::destroy() void ssl_auto_handle::destroy()
@ -680,7 +680,7 @@ io_transport_kcp::io_transport_kcp(io_channel* ctx, std::shared_ptr<xxsocket>& s
::ikcp_setoutput(this->kcp_, [](const char* buf, int len, ::ikcpcb* /*kcp*/, void* user) { ::ikcp_setoutput(this->kcp_, [](const char* buf, int len, ::ikcpcb* /*kcp*/, void* user) {
auto t = (io_transport_kcp*)user; auto t = (io_transport_kcp*)user;
if (yasio__min_wait_duration == 0) if (yasio__min_wait_duration == 0)
return t->write_cb_(buf, len, &t->ensure_destination()); return t->write_cb_(buf, len, std::addressof(t->ensure_destination()));
// Enqueue to transport queue // Enqueue to transport queue
return t->io_transport_udp::write(std::vector<char>(buf, buf + len), nullptr); return t->io_transport_udp::write(std::vector<char>(buf, buf + len), nullptr);
}); });

View File

@ -31,7 +31,6 @@ SOFTWARE.
#include <algorithm> #include <algorithm>
#include <atomic> #include <atomic>
#include <condition_variable> #include <condition_variable>
#include <memory>
#include <mutex> #include <mutex>
#include <thread> #include <thread>
#include <vector> #include <vector>