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