mirror of https://github.com/axmolengine/axmol.git
Fix udp disconnect ipv6 for windows
This commit is contained in:
parent
7a7aa81ae2
commit
9b607c899d
|
@ -286,8 +286,6 @@ int xxsocket::getipsv(void)
|
||||||
|
|
||||||
void xxsocket::traverse_local_address(std::function<bool(const ip::endpoint&)> handler)
|
void xxsocket::traverse_local_address(std::function<bool(const ip::endpoint&)> handler)
|
||||||
{
|
{
|
||||||
int family = AF_UNSPEC;
|
|
||||||
bool done = false;
|
|
||||||
/* Only windows support use getaddrinfo to get local ip address(not loopback or linklocal),
|
/* Only windows support use getaddrinfo to get local ip address(not loopback or linklocal),
|
||||||
Because nullptr same as "localhost": always return loopback address and at unix/linux the
|
Because nullptr same as "localhost": always return loopback address and at unix/linux the
|
||||||
gethostname always return "localhost"
|
gethostname always return "localhost"
|
||||||
|
@ -596,11 +594,12 @@ int xxsocket::connect_n(socket_native_type s, const endpoint& ep)
|
||||||
int xxsocket::disconnect() const { return xxsocket::disconnect(this->fd); }
|
int xxsocket::disconnect() const { return xxsocket::disconnect(this->fd); }
|
||||||
int xxsocket::disconnect(socket_native_type s)
|
int xxsocket::disconnect(socket_native_type s)
|
||||||
{
|
{
|
||||||
|
#if defined(_WIN32)
|
||||||
|
sockaddr_storage addr_unspec{0};
|
||||||
|
return ::connect(s, (sockaddr*)&addr_unspec, sizeof(addr_unspec));
|
||||||
|
#else
|
||||||
sockaddr addr_unspec{0};
|
sockaddr addr_unspec{0};
|
||||||
addr_unspec.sa_family = AF_UNSPEC;
|
addr_unspec.sa_family = AF_UNSPEC;
|
||||||
#if defined(_WIN32)
|
|
||||||
return ::connect(s, &addr_unspec, sizeof(addr_unspec));
|
|
||||||
#else
|
|
||||||
int ret, error;
|
int ret, error;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -615,7 +614,7 @@ int xxsocket::disconnect(socket_native_type s)
|
||||||
* The udp socket will be success disconnected by kernel function: `sodisconnect(upic_socket.c)`, then in the kernel, will continue try to
|
* The udp socket will be success disconnected by kernel function: `sodisconnect(upic_socket.c)`, then in the kernel, will continue try to
|
||||||
* connect with new sockaddr, but will failed with follow errno:
|
* connect with new sockaddr, but will failed with follow errno:
|
||||||
* a. EINVAL: addrlen mismatch
|
* a. EINVAL: addrlen mismatch
|
||||||
* b. ENOSUPPORT: family mismatch
|
* b. EAFNOSUPPORT: family mismatch
|
||||||
* So, we just simply ignore them for the disconnect behavior.
|
* So, we just simply ignore them for the disconnect behavior.
|
||||||
*/
|
*/
|
||||||
return (error == EAFNOSUPPORT || error == EINVAL) ? 0 : -1;
|
return (error == EAFNOSUPPORT || error == EINVAL) ? 0 : -1;
|
||||||
|
|
|
@ -266,7 +266,7 @@ public:
|
||||||
if (rbracket && rbracket[1] == ':')
|
if (rbracket && rbracket[1] == ':')
|
||||||
{
|
{
|
||||||
auto zone_value = parse_in6_zone(ip, addr_part, sizeof(addr_part), rbracket);
|
auto zone_value = parse_in6_zone(ip, addr_part, sizeof(addr_part), rbracket);
|
||||||
as_in6(ip, atoi(rbracket + 2), zone_value);
|
as_in6(ip, static_cast<u_short>(atoi(rbracket + 2)), zone_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -277,7 +277,7 @@ public:
|
||||||
auto n = colon - str_ep;
|
auto n = colon - str_ep;
|
||||||
memcpy(addr_part, str_ep, n);
|
memcpy(addr_part, str_ep, n);
|
||||||
addr_part[n] = '\0';
|
addr_part[n] = '\0';
|
||||||
as_in4(addr_part, atoi(colon + 1));
|
as_in4(addr_part, static_cast<u_short>(atoi(colon + 1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -373,7 +373,7 @@ public:
|
||||||
|
|
||||||
void zeroset() { ::memset(this, 0x0, sizeof(*this)); }
|
void zeroset() { ::memset(this, 0x0, sizeof(*this)); }
|
||||||
|
|
||||||
void af(int v) { sa_.sa_family = v; }
|
void af(int v) { sa_.sa_family = static_cast<u_short>(v); }
|
||||||
int af() const { return sa_.sa_family; }
|
int af() const { return sa_.sa_family; }
|
||||||
|
|
||||||
void ip(const char* addr)
|
void ip(const char* addr)
|
||||||
|
|
|
@ -1477,7 +1477,7 @@ void io_service::do_ssl_handshake(io_channel* ctx)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(YASIO_HAVE_CARES)
|
#if defined(YASIO_HAVE_CARES)
|
||||||
void io_service::ares_getaddrinfo_cb(void* arg, int status, int timeouts, ares_addrinfo* answerlist)
|
void io_service::ares_getaddrinfo_cb(void* arg, int status, int /*timeouts*/, ares_addrinfo* answerlist)
|
||||||
{
|
{
|
||||||
auto ctx = (io_channel*)arg;
|
auto ctx = (io_channel*)arg;
|
||||||
auto& current_service = ctx->get_service();
|
auto& current_service = ctx->get_service();
|
||||||
|
@ -1565,7 +1565,6 @@ void io_service::config_ares_name_servers()
|
||||||
int status = ::ares_get_servers_ports(ares_, &name_servers);
|
int status = ::ares_get_servers_ports(ares_, &name_servers);
|
||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
int count = 0;
|
|
||||||
for (auto ns = name_servers; ns != nullptr; ns = ns->next)
|
for (auto ns = name_servers; ns != nullptr; ns = ns->next)
|
||||||
if (endpoint{ns->family, &ns->addr, static_cast<u_short>(ns->udp_port)}.format_to(nscsv, endpoint::fmt_default | endpoint::fmt_no_local))
|
if (endpoint{ns->family, &ns->addr, static_cast<u_short>(ns->udp_port)}.format_to(nscsv, endpoint::fmt_default | endpoint::fmt_no_local))
|
||||||
nscsv.push_back(',');
|
nscsv.push_back(',');
|
||||||
|
@ -1792,6 +1791,7 @@ void io_service::notify_connect_succeed(transport_handle_t t)
|
||||||
auto ctx = t->ctx_;
|
auto ctx = t->ctx_;
|
||||||
auto& s = t->socket_;
|
auto& s = t->socket_;
|
||||||
this->transports_.push_back(t);
|
this->transports_.push_back(t);
|
||||||
|
YASIO__UNUSED_PARAM(s);
|
||||||
YASIO_KLOGV("[index: %d] sndbuf=%d, rcvbuf=%d", ctx->index_, s->get_optval<int>(SOL_SOCKET, SO_SNDBUF), s->get_optval<int>(SOL_SOCKET, SO_RCVBUF));
|
YASIO_KLOGV("[index: %d] sndbuf=%d, rcvbuf=%d", ctx->index_, s->get_optval<int>(SOL_SOCKET, SO_SNDBUF), s->get_optval<int>(SOL_SOCKET, SO_RCVBUF));
|
||||||
YASIO_KLOGD("[index: %d] the connection #%u(%p) <%s> --> <%s> is established.", ctx->index_, t->id_, t, t->local_endpoint().to_string().c_str(),
|
YASIO_KLOGD("[index: %d] the connection #%u(%p) <%s> --> <%s> is established.", ctx->index_, t->id_, t, t->local_endpoint().to_string().c_str(),
|
||||||
t->remote_endpoint().to_string().c_str());
|
t->remote_endpoint().to_string().c_str());
|
||||||
|
|
Loading…
Reference in New Issue