mirror of
https://github.com/godotengine/godot.git
synced 2024-11-27 09:16:35 +08:00
[WS] Fix set_no_delay on Windows
Windows socket implementation is, as usual, broken in many ways. This includes `setsockopt` failing to set `TCP_NODELAY` if the socket is still in a connecting state. This also means we need to keep polling the IP resolver until the socket reaches the CONNECTED state (so it can set the TCP_NODELAY after the connection is successful).
This commit is contained in:
parent
eabeafd8c3
commit
7f610a2c6e
@ -99,6 +99,8 @@ void WSLPeer::Resolver::try_next_candidate(Ref<StreamPeerTCP> &p_tcp) {
|
|||||||
p_tcp->poll();
|
p_tcp->poll();
|
||||||
StreamPeerTCP::Status status = p_tcp->get_status();
|
StreamPeerTCP::Status status = p_tcp->get_status();
|
||||||
if (status == StreamPeerTCP::STATUS_CONNECTED) {
|
if (status == StreamPeerTCP::STATUS_CONNECTED) {
|
||||||
|
// On Windows, setting TCP_NODELAY may fail if the socket is still connecting.
|
||||||
|
p_tcp->set_no_delay(true);
|
||||||
ip_candidates.clear();
|
ip_candidates.clear();
|
||||||
return;
|
return;
|
||||||
} else if (status == StreamPeerTCP::STATUS_CONNECTING) {
|
} else if (status == StreamPeerTCP::STATUS_CONNECTING) {
|
||||||
@ -112,7 +114,6 @@ void WSLPeer::Resolver::try_next_candidate(Ref<StreamPeerTCP> &p_tcp) {
|
|||||||
while (ip_candidates.size()) {
|
while (ip_candidates.size()) {
|
||||||
Error err = p_tcp->connect_to_host(ip_candidates.pop_front(), port);
|
Error err = p_tcp->connect_to_host(ip_candidates.pop_front(), port);
|
||||||
if (err == OK) {
|
if (err == OK) {
|
||||||
p_tcp->set_no_delay(true);
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
p_tcp->disconnect_from_host();
|
p_tcp->disconnect_from_host();
|
||||||
@ -311,7 +312,7 @@ void WSLPeer::_do_client_handshake() {
|
|||||||
ERR_FAIL_COND(tcp.is_null());
|
ERR_FAIL_COND(tcp.is_null());
|
||||||
|
|
||||||
// Try to connect to candidates.
|
// Try to connect to candidates.
|
||||||
if (resolver.has_more_candidates()) {
|
if (resolver.has_more_candidates() || tcp->get_status() == StreamPeerTCP::STATUS_CONNECTING) {
|
||||||
resolver.try_next_candidate(tcp);
|
resolver.try_next_candidate(tcp);
|
||||||
if (resolver.has_more_candidates()) {
|
if (resolver.has_more_candidates()) {
|
||||||
return; // Still pending.
|
return; // Still pending.
|
||||||
|
Loading…
Reference in New Issue
Block a user