методология для обработки структуры, содержащей uv_tcp_client - PullRequest
0 голосов
/ 25 марта 2020

Это не реальный вопрос для игроков языка C и экспертов по сетевому программированию, но я хотел бы начать обсуждение того, как работать со структурой, содержащей базовые c компоненты libuv, такие как uv_tcp_client или что-то еще.

Позвольте мне привести более подробный сценарий, чтобы начать наше обсуждение. uv_read_start - это функция, которую мы используем для чтения из потока, связывающегося с сервером. Третий аргумент - указатель на функцию, подготовленную после операции чтения. Прототип этой функции выглядит так:

void uv_read_start(uv_stream_t*, alloc_buf_function, after_read_function)
void after_read_function(uv_stream_t*, ssize_t nread,const uv_buf_t* buf)

В after_read_function, если nread <0, что означает, что произошла какая-то ошибка, и мы должны освободить uv_stream_t *. Пока что мы в порядке, если вы используете только переменную из libuv. </p>

Но если вы установите пользовательскую структуру, содержащую uv_stream_t *, ситуация может стать запутанной.

typedef struct 
{ 
    uv_stream_t* tcp_client;
    ...
} client;

....
client* cli = malloc(sizeof(client));
uv_read_start(cli->tcp_client, alloc_buf_function, after_read_function);
....

void after_read_function(uv_stream_t* tcp_client, ssize_t nread, const uv_buf_t* buf){
    if (nread < 0) {
       // error take place
       // we should not only free tcp_client, but also the client struct we malloc outside.
       // However, this function is a callback one and type of arguments has been determinated 
       // in libuv source code and I can't bring client into this function.
    }
}

Итак, любой может помочь с этой проблемой?

Заранее спасибо.

...