|
|
|
|
@ -32,8 +32,28 @@
|
|
|
|
|
|
|
|
|
|
#include "core/config/project_settings.h"
|
|
|
|
|
|
|
|
|
|
Error StreamPeerTCP::_poll_connection() {
|
|
|
|
|
ERR_FAIL_COND_V(status != STATUS_CONNECTING || !_sock.is_valid() || !_sock->is_open(), FAILED);
|
|
|
|
|
Error StreamPeerTCP::poll() {
|
|
|
|
|
if (status == STATUS_CONNECTED) {
|
|
|
|
|
Error err;
|
|
|
|
|
err = _sock->poll(NetSocket::POLL_TYPE_IN, 0);
|
|
|
|
|
if (err == OK) {
|
|
|
|
|
// FIN received
|
|
|
|
|
if (_sock->get_available_bytes() == 0) {
|
|
|
|
|
disconnect_from_host();
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Also poll write
|
|
|
|
|
err = _sock->poll(NetSocket::POLL_TYPE_IN_OUT, 0);
|
|
|
|
|
if (err != OK && err != ERR_BUSY) {
|
|
|
|
|
// Got an error
|
|
|
|
|
disconnect_from_host();
|
|
|
|
|
status = STATUS_ERROR;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
} else if (status != STATUS_CONNECTING) {
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error err = _sock->connect_to_host(peer_host, peer_port);
|
|
|
|
|
|
|
|
|
|
@ -121,22 +141,7 @@ Error StreamPeerTCP::connect_to_host(const IPAddress &p_host, int p_port) {
|
|
|
|
|
Error StreamPeerTCP::write(const uint8_t *p_data, int p_bytes, int &r_sent, bool p_block) {
|
|
|
|
|
ERR_FAIL_COND_V(!_sock.is_valid(), ERR_UNAVAILABLE);
|
|
|
|
|
|
|
|
|
|
if (status == STATUS_NONE || status == STATUS_ERROR) {
|
|
|
|
|
return FAILED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status != STATUS_CONNECTED) {
|
|
|
|
|
if (_poll_connection() != OK) {
|
|
|
|
|
return FAILED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status != STATUS_CONNECTED) {
|
|
|
|
|
r_sent = 0;
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!_sock->is_open()) {
|
|
|
|
|
return FAILED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -179,21 +184,10 @@ Error StreamPeerTCP::write(const uint8_t *p_data, int p_bytes, int &r_sent, bool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error StreamPeerTCP::read(uint8_t *p_buffer, int p_bytes, int &r_received, bool p_block) {
|
|
|
|
|
if (!is_connected_to_host()) {
|
|
|
|
|
if (status != STATUS_CONNECTED) {
|
|
|
|
|
return FAILED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status == STATUS_CONNECTING) {
|
|
|
|
|
if (_poll_connection() != OK) {
|
|
|
|
|
return FAILED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status != STATUS_CONNECTED) {
|
|
|
|
|
r_received = 0;
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error err;
|
|
|
|
|
int to_read = p_bytes;
|
|
|
|
|
int total_read = 0;
|
|
|
|
|
@ -243,36 +237,11 @@ Error StreamPeerTCP::read(uint8_t *p_buffer, int p_bytes, int &r_received, bool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void StreamPeerTCP::set_no_delay(bool p_enabled) {
|
|
|
|
|
ERR_FAIL_COND(!is_connected_to_host());
|
|
|
|
|
ERR_FAIL_COND(!_sock.is_valid() || !_sock->is_open());
|
|
|
|
|
_sock->set_tcp_no_delay_enabled(p_enabled);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool StreamPeerTCP::is_connected_to_host() const {
|
|
|
|
|
return _sock.is_valid() && _sock->is_open() && (status == STATUS_CONNECTED || status == STATUS_CONNECTING);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StreamPeerTCP::Status StreamPeerTCP::get_status() {
|
|
|
|
|
if (status == STATUS_CONNECTING) {
|
|
|
|
|
_poll_connection();
|
|
|
|
|
} else if (status == STATUS_CONNECTED) {
|
|
|
|
|
Error err;
|
|
|
|
|
err = _sock->poll(NetSocket::POLL_TYPE_IN, 0);
|
|
|
|
|
if (err == OK) {
|
|
|
|
|
// FIN received
|
|
|
|
|
if (_sock->get_available_bytes() == 0) {
|
|
|
|
|
disconnect_from_host();
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Also poll write
|
|
|
|
|
err = _sock->poll(NetSocket::POLL_TYPE_IN_OUT, 0);
|
|
|
|
|
if (err != OK && err != ERR_BUSY) {
|
|
|
|
|
// Got an error
|
|
|
|
|
disconnect_from_host();
|
|
|
|
|
status = STATUS_ERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StreamPeerTCP::Status StreamPeerTCP::get_status() const {
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -287,7 +256,7 @@ void StreamPeerTCP::disconnect_from_host() {
|
|
|
|
|
peer_port = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error StreamPeerTCP::poll(NetSocket::PollType p_type, int timeout) {
|
|
|
|
|
Error StreamPeerTCP::wait(NetSocket::PollType p_type, int timeout) {
|
|
|
|
|
ERR_FAIL_COND_V(_sock.is_null() || !_sock->is_open(), ERR_UNAVAILABLE);
|
|
|
|
|
return _sock->poll(p_type, timeout);
|
|
|
|
|
}
|
|
|
|
|
@ -346,7 +315,7 @@ Error StreamPeerTCP::_connect(const String &p_address, int p_port) {
|
|
|
|
|
void StreamPeerTCP::_bind_methods() {
|
|
|
|
|
ClassDB::bind_method(D_METHOD("bind", "port", "host"), &StreamPeerTCP::bind, DEFVAL("*"));
|
|
|
|
|
ClassDB::bind_method(D_METHOD("connect_to_host", "host", "port"), &StreamPeerTCP::_connect);
|
|
|
|
|
ClassDB::bind_method(D_METHOD("is_connected_to_host"), &StreamPeerTCP::is_connected_to_host);
|
|
|
|
|
ClassDB::bind_method(D_METHOD("poll"), &StreamPeerTCP::poll);
|
|
|
|
|
ClassDB::bind_method(D_METHOD("get_status"), &StreamPeerTCP::get_status);
|
|
|
|
|
ClassDB::bind_method(D_METHOD("get_connected_host"), &StreamPeerTCP::get_connected_host);
|
|
|
|
|
ClassDB::bind_method(D_METHOD("get_connected_port"), &StreamPeerTCP::get_connected_port);
|
|
|
|
|
|