Browse Source

control socket disconnect fix

nodeinfo-routing-update
jeka 2 weeks ago
parent
commit
4c3681c045
  1. 46
      src/control_server.c
  2. 2
      src/control_server.h
  3. 13
      src/etcp.c
  4. 5
      src/etcp.h
  5. 6
      src/etcp_connections.h

46
src/control_server.c

@ -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 */
@ -419,7 +419,10 @@ static void client_read_callback(socket_t fd, void* arg) {
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) {
@ -428,18 +431,23 @@ static void client_read_callback(socket_t fd, void* arg) {
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",
(unsigned long long)get_timestamp_ms());
fflush(server->log_file);
}
client->connected = 0;
if (server) {
close_client(server, client);
}
return;
}
#else
@ -452,18 +460,23 @@ static void client_read_callback(socket_t fd, void* arg) {
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",
(unsigned long long)get_timestamp_ms());
fflush(server->log_file);
}
client->connected = 0;
if (server) {
close_client(server, client);
}
return;
}
#endif
@ -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");
struct control_server* server = client ? client->server : NULL;
/* Mark for cleanup */
client->connected = 0;
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;
}

2
src/control_server.h

@ -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 */

13
src/etcp.c

@ -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;

5
src/etcp.h

@ -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;

6
src/etcp_connections.h

@ -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)

Loading…
Cancel
Save