control socket disconnect fix
This commit is contained in:
1 parent
be037780a5
commit
4c3681c045
5 files changed
+61
-33
No files matched your search
+42
-26
@@ -354,7 +354,7 @@ static void accept_callback(socket_t fd, void* arg) {
|
||||
|
||||
client->fd = client_fd;
|
||||
client->server = server; /* Store back pointer to server */
|
||||
client->connected = 1;
|
||||
// client->connected = 1;
|
||||
client->selected_peer_id = 0;
|
||||
|
||||
/* Register with uasync */
|
||||
@@ -407,39 +407,47 @@ static void accept_callback(socket_t fd, void* arg) {
|
||||
static void client_read_callback(socket_t fd, void* arg) {
|
||||
struct control_client* client = (struct control_client*)arg;
|
||||
struct control_server* server = client->server;
|
||||
|
||||
|
||||
/* Read available data */
|
||||
uint8_t* buf = client->recv_buffer + client->recv_len;
|
||||
size_t buf_space = ETCPMON_MAX_MSG_SIZE - client->recv_len;
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
int received = recv(fd, (char*)buf, (int)buf_space, 0);
|
||||
|
||||
|
||||
if (received == SOCKET_ERROR) {
|
||||
int err = WSAGetLastError();
|
||||
if (err != WSAEWOULDBLOCK) {
|
||||
if (err == 10054) {
|
||||
client->connected = 0;
|
||||
/* Connection reset by peer — нормальное отключение */
|
||||
if (server) {
|
||||
close_client(server, client);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (server && server->log_file) {
|
||||
fprintf(server->log_file, "%llu: [ERROR] Client recv error: %d\n",
|
||||
fprintf(server->log_file, "%llu: [ERROR] Client recv error: %d\n",
|
||||
(unsigned long long)get_timestamp_ms(), err);
|
||||
fflush(server->log_file);
|
||||
}
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Client recv error: %d", err);
|
||||
client->connected = 0;
|
||||
if (server) {
|
||||
close_client(server, client);
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (received == 0) {
|
||||
/* Connection closed */
|
||||
/* Connection closed gracefully */
|
||||
if (server && server->log_file) {
|
||||
fprintf(server->log_file, "%llu: [LOG] Client disconnected (recv returned 0)\n",
|
||||
fprintf(server->log_file, "%llu: [LOG] Client disconnected (recv returned 0)\n",
|
||||
(unsigned long long)get_timestamp_ms());
|
||||
fflush(server->log_file);
|
||||
}
|
||||
client->connected = 0;
|
||||
if (server) {
|
||||
close_client(server, client);
|
||||
}
|
||||
return;
|
||||
}
|
||||
#else
|
||||
@@ -447,34 +455,39 @@ static void client_read_callback(socket_t fd, void* arg) {
|
||||
if (received < 0) {
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
||||
if (server && server->log_file) {
|
||||
fprintf(server->log_file, "%llu: [ERROR] Client recv error: %s\n",
|
||||
fprintf(server->log_file, "%llu: [ERROR] Client recv error: %s\n",
|
||||
(unsigned long long)get_timestamp_ms(), strerror(errno));
|
||||
fflush(server->log_file);
|
||||
}
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Client recv error: %s", strerror(errno));
|
||||
client->connected = 0;
|
||||
if (server) {
|
||||
close_client(server, client);
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (received == 0) {
|
||||
/* Connection closed */
|
||||
/* Connection closed gracefully */
|
||||
if (server && server->log_file) {
|
||||
fprintf(server->log_file, "%llu: [LOG] Client disconnected (recv returned 0)\n",
|
||||
fprintf(server->log_file, "%llu: [LOG] Client disconnected (recv returned 0)\n",
|
||||
(unsigned long long)get_timestamp_ms());
|
||||
fflush(server->log_file);
|
||||
}
|
||||
client->connected = 0;
|
||||
if (server) {
|
||||
close_client(server, client);
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Log received data */
|
||||
if (server && server->log_file) {
|
||||
log_hex_data(server->log_file, "RX", buf, received);
|
||||
}
|
||||
|
||||
|
||||
client->recv_len += received;
|
||||
|
||||
|
||||
/* Process messages */
|
||||
if (server) {
|
||||
handle_client_data(server, client);
|
||||
@@ -489,13 +502,16 @@ static void client_write_callback(socket_t fd, void* arg) {
|
||||
|
||||
static void client_except_callback(socket_t fd, void* arg) {
|
||||
struct control_client* client = (struct control_client*)arg;
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Client socket exception");
|
||||
|
||||
/* Mark for cleanup */
|
||||
client->connected = 0;
|
||||
struct control_server* server = client ? client->server : NULL;
|
||||
|
||||
if (server) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Client socket exception");
|
||||
close_client(server, client); // <-- сразу удаляем из uasync
|
||||
}
|
||||
(void)fd;
|
||||
}
|
||||
|
||||
|
||||
static void close_client(struct control_server* server, struct control_client* client) {
|
||||
if (!server || !client) return;
|
||||
|
||||
@@ -951,11 +967,11 @@ void control_server_process_updates(struct control_server* server) {
|
||||
while (client) {
|
||||
struct control_client* next = client->next;
|
||||
|
||||
if (!client->connected) {
|
||||
close_client(server, client);
|
||||
} else if (client->recv_len > 0) {
|
||||
// if (!client->connected) {
|
||||
// close_client(server, client);
|
||||
// } else if (client->recv_len > 0) {
|
||||
handle_client_data(server, client);
|
||||
}
|
||||
// }
|
||||
|
||||
client = next;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ struct control_client {
|
||||
uint64_t selected_peer_id; /* 0 = none selected */
|
||||
|
||||
/* Client state */
|
||||
uint8_t connected;
|
||||
// uint8_t connected;
|
||||
};
|
||||
|
||||
/* Control server state */
|
||||
|
||||
+11
-2
@@ -917,9 +917,18 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) {
|
||||
case ETCP_SECTION_TIMESTAMP: {
|
||||
uint16_t cur_ts=get_current_timestamp();
|
||||
uint16_t ret_ts=data[1] | (data[2]<<8);// cur_ts=ret_ts = RTT
|
||||
uint16_t recv_dt=data[3] | (data[4]<<8);
|
||||
pkt->link->rtt_last=cur_ts-ret_ts;
|
||||
pkt->link->recv_dt_last=recv_dt;
|
||||
int recv_dt_tx1=data[3] | (data[4]<<8);// localtime удаленной стороны момента принятия пакета - timestamp этого пакета (на стороне отправителя, т.е. у нас)
|
||||
|
||||
int recv_dt_tx=recv_dt_tx1 - pkt->link->rtt_last/2;
|
||||
int recv_dt_rx=cur_ts - pkt->link->rtt_last/2 - ts;
|
||||
if (pkt->link->recv_dt_avg_rx==0) pkt->link->recv_dt_avg_rx=recv_dt_rx*256;
|
||||
if (pkt->link->recv_dt_avg_tx==0) pkt->link->recv_dt_avg_tx=recv_dt_tx*256;
|
||||
pkt->link->recv_dt_avg_rx +=(recv_dt_rx*256 - pkt->link->recv_dt_avg_rx)/256;
|
||||
pkt->link->recv_dt_avg_tx +=(recv_dt_tx*256 - pkt->link->recv_dt_avg_tx)/256;
|
||||
pkt->link->tt_last = recv_dt_tx1;// - pkt->link->recv_dt_avg_tx/256;
|
||||
pkt->link->rt_last = cur_ts - ts - pkt->link->recv_dt_avg_tx/256;
|
||||
//tts_correction += ((NOW - RTT/2 - TTS) - tts_correction)/16 (инициализируем сразу по 1 пакету)
|
||||
data+=5; len-=5;
|
||||
|
||||
struct ETCP_LINK* c=etcp->links;
|
||||
|
||||
+3
-2
@@ -111,8 +111,9 @@ struct ETCP_CONN {
|
||||
|
||||
// Metrics (RTT, jitter, etc.)
|
||||
// uint16_t retrans_delay; // Not used
|
||||
uint16_t rtt_last;
|
||||
uint16_t tt_last;
|
||||
uint16_t rtt_last;// round-trip time
|
||||
uint16_t tt_last;// transmission time (время пакета до меня)
|
||||
// uint16_t rxt_last;// recv relative time (бустро регаирует на изменение задержки rx и медленно на изменение задержки tx)
|
||||
uint16_t rtt_avg_10;
|
||||
uint16_t rtt_avg_100;
|
||||
uint16_t jitter;
|
||||
|
||||
@@ -98,9 +98,11 @@ struct ETCP_LINK {
|
||||
size_t total_decrypted;
|
||||
|
||||
uint16_t rtt_last; // round trip (время отправки + приёма)
|
||||
uint16_t recv_dt_last; // дельта времени для отправленных пакетов (относительное время отправки)
|
||||
uint32_t recv_dt_avg_tx; // дельта времени для отправленных пакетов (относительное время отправки) x256
|
||||
uint32_t recv_dt_avg_rx; // дельта времени для принятых пакетов (относительное время отправки) x256
|
||||
|
||||
uint16_t tt_last; // transmit time (время отправки пакета)
|
||||
uint16_t tt_last; // transmit time (время доставки отправленных пакетов)
|
||||
uint16_t rt_last; // recv time (время доставки принятых пакетов)
|
||||
uint32_t bandwidth; // Link bandwidth in Kbits/sec
|
||||
|
||||
// NAT address tracking (from INIT_RESPONSE)
|
||||
|
||||
Reference in new issue
Block a user